JavaRush /Java Blog /Random-IT /Introduzione al quadro di Jackson
Mikhail Fufaev
Livello 35
Москва

Introduzione al quadro di Jackson

Pubblicato nel gruppo Random-IT
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.
Jackson Quadro
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
È importante capire che i metodi funzionano in modo disgiuntivo. Quelli. se il campo corrisponde ad almeno uno dei parametri specificati nell'annotazione, verrà incluso in JSON. Prova a rispondere a cosa restituirà questo codice se creiamo un'istanza utilizzando un costruttore senza parametri:
@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 :)
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION