In una fredda notte primaverile, ho finalmente raggiunto il livello 33. Fregandomi le mani da programmatore, mi stavo già preparando ad abbracciare l'intero campo della serializzazione e deserializzazione JSON, ma purtroppo non ci ho capito nulla. Non ricordavo il testo della conferenza, ma i problemi sono stati risolti in qualche modo in modo intuitivo. A questo proposito, ho deciso di addentrarmi nelle terre selvagge del Jackson Framework e capire cos'è questo JSON.
Cercherò di presentare tutta la mia conoscenza in modo pratico e conciso in un formato cheat sheet (sia per me che per i lettori). Viaggio a Jackson Annotazioni. La prima cosa che incontriamo nel percorso verso JSON è l'annotazione @JsonAutoDetect. A prima vista, è un riassunto semplice, ma l’autore ha impiegato più tempo per capirlo. L'abstract ha 5 metodi di cui abbiamo bisogno:
- fieldVisibility () - Serializza solo i campi con il modificatore di accesso specificato
- getterVisibility()/setterVisibility() - serializza i campi il cui getter/setter ha il modificatore di accesso specificato
- isGetterVisibility() - implementazione separata per getter booleani
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY,
getterVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY,
setterVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY,
isGetterVisibility = JsonAutoDetect.Visibility.PROTECTED_AND_PUBLIC)
public class HeadClass {
public String name;
private Map<String, String> properties;
public Queue<String> queue;
protected List<String> list;
private int age;
private int number;
private boolean isHead;
protected HeadClass(int age) {
this.age = age;
}
public HeadClass() {}
Map<String, String> getProperties() {
return properties;
}
protected boolean isHead() {
return isHead;
}
protected void setProperties(Map<String, String> properties) {
this.properties = properties;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
Cosa succede se rimuoviamo isGetterVisibility? I quattro metodi elencati configurano il processo di serializzazione. La quinta, a sua volta, regola il processo di deserializzazione:
- creatorVisibility() è il metodo più difficile da comprendere. Funziona con costruttori e con metodi factory (metodi che creano un oggetto quando vengono chiamati). Diamo un'occhiata ad un esempio:
@JsonAutoDetect(creatorVisibility = JsonAutoDetect.Visibility.PROTECTED_AND_PUBLIC)
public class HeadClass {
public String name;
public int id;
HeadClass(@JsonProperty(value = "name") String name, @JsonProperty(value = "id") int id) {
this.name = name;
this.id = id;
}
protected HeadClass(String name) {
this.name = name;
this.id = 123;
}
protected HeadClass(int id) {
this.id = id;
this.name = "Yes!";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
String forDeserialize = "{\"name\":\"No!\",\"id\":123}";
StringReader reader = new StringReader(forDeserialize);
HeadClass headClass1 = (HeadClass) mapper.readValue(reader, HeadClass.class);
}
Nota importante sul meccanismo di deserializzazione! Quando proviamo a creare un oggetto da JSON, il costruttore della classe richiesta verrà cercato con lo stesso set di parametri dell'oggetto JSON. Nell'esempio sopra, il nostro oggetto JSON è composto da due parametri: name, id. Indovina quale costruttore chiamerà. E sì, se compiliamo questo codice, genererà un errore, perché? Perché abbiamo limitato la visibilità del costruttore (sono visibili solo i costruttori con il modificatore protected, public). Se rimuovi creatorVisibility funzionerà. La domanda sorge spontanea. Cos'è @JsonProperty nel costruttore? Penso che ne parlerò nella prossima parte dell’articolo. PS Signori, mi piacerebbe davvero ricevere almeno qualche risposta sull'articolo. Mi chiedo se questo argomento sia richiesto e se valga la pena continuare, perché gli argomenti sono tanti e sono tutti molto interessanti. Vorrei anche prendere in considerazione annotazioni come @JsonView, @JsonManagedReference, @JsonBackReference, @JsonUnwrapped, ecc. Grazie :)
GO TO FULL VERSION