2016-11-05 22 views
6

Zastanawiam się nad czymś podczas pracy nad naszym projektem. Czy API GSON od Google używa konstruktorów z JSON-a, które chcesz deserializować? Na przykład:Java - Czy Google GSON używa konstruktorów?

Mam ciąg JSON, który chcę przekonwertować na obiekt pracownika. Obiekt Employee ma konstruktor, który stosuje pewne sprawdzenia parametrów (na przykład, jest to ID> 0). Używamy poniższego kodu do deserializacji JSON-ów. Ale czy ten konstruktor jest wywoływany nawet podczas deserializacji JSON do pracownika?

Link do GSON: https://github.com/google/gson

EDIT: Więc po eksperymenty z punktów przerwie zorientowali się konstruktora nie jest tzw. Czy ktokolwiek zna sposób, aby mimo wszystko go wywołać?

/** 
* The GSON class to help you create and de-serialize the JSON objects. 
*/ 
Gson gson = new Gson(); 

/** 
* Convert JSON to an object. 
* @param json The JSON to convert. 
* @param cls The class to convert to. 
* @return The converted JSON to object. 
*/ 
public Object jsonToObject(String json, Class<?> cls) { 
    return gson.fromJson(json, cls); 
} 
+2

umieścić punkt przerwania w konstruktorze i debugować kod, nie? –

+0

@RC. Tak, masz rację, właśnie to przetestowałem, a konstruktor nie został wywołany. – Guido

+1

Założę się, że używa pustego konstruktora do utworzenia instancji obiektu, a pola odczytu zostaną ustawione bezpośrednio za pomocą odbicia. – EpicPandaForce

Odpowiedz

7

Biblioteki jak GSON, Jackson czy Java Persistence API (JPA) ogólnie użyć bez argumentów (domyślnie) konstruktor instancję obiektu i ustawić jego pola poprzez odbicie. W nowszych wersjach GSON nie musisz już zadeklarować domyślnego konstruktora, zobacz here.

Jeśli musisz zadzwonić do określonego konstruktora w GSON, możesz zaimplementować niestandardowy JsonDeserializer, taki jak wspomniano wcześniej: here.

W innych bibliotekach, takich jak Jackson, można zdefiniować deserializację na metodach, zamiast na polach (takich jak GSON does), co pozwala zastąpić brakujące specjalistyczne wywołanie konstruktora.