JavaRush /Blog Java /Random-FR /Introduction au cadre Jackson
Mikhail Fufaev
Niveau 35
Москва

Introduction au cadre Jackson

Publié dans le groupe Random-FR
Par une froide nuit de printemps, j’ai finalement atteint le niveau 33. En me frottant les mains de programmeur, je me préparais déjà à embrasser tout le domaine de la sérialisation et de la désérialisation JSON, mais, malheureusement, je n'ai rien compris. Je ne me souvenais pas du texte de la conférence, mais les problèmes ont été résolus d'une manière ou d'une autre intuitivement. À cet égard, j'ai décidé de me plonger dans les profondeurs du Jackson Framework et de comprendre ce qu'est ce JSON.
Cadre Jackson
J'essaierai de présenter toutes mes connaissances de manière pratique et concise sous forme d'aide-mémoire (aussi bien pour moi que pour les lecteurs). Voyage vers les annotations de Jackson. La première chose que nous rencontrons sur le chemin vers JSON est l'annotation @JsonAutoDetect. À première vue, c’est un résumé simple, mais c’est à l’auteur que c’est celui qui a mis le plus de temps à le comprendre. Le résumé comporte 5 méthodes dont nous avons besoin :
  • fieldVisibility () - Sérialise uniquement les champs avec le modificateur d'accès spécifié
  • getterVisibility()/setterVisibility() - sérialise les champs dont le getter/setter a le modificateur d'accès spécifié
  • isGetterVisibility() - implémentation séparée pour les getters booléens
Il est important de comprendre que les méthodes fonctionnent de manière disjonctive. Ceux. si le champ correspond à au moins un des paramètres spécifiés dans l'annotation, alors il sera inclus dans JSON. Essayez de répondre à ce que ce code produira si nous créons une instance à l'aide d'un constructeur sans paramètre :
@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;
    }
}
Et si nous supprimions isGetterVisibility ? Les quatre méthodes répertoriées ont configuré le processus de sérialisation. Le cinquième, à son tour, régule le processus de désérialisation :
  • CreatorVisibility() est la méthode la plus difficile à comprendre. Il fonctionne avec les constructeurs et avec les méthodes d'usine (méthodes qui créent un objet lorsqu'elles sont appelées). Regardons un exemple :
@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);
}
Note importante sur le mécanisme de désérialisation ! Lorsque nous essayons de créer un objet à partir de JSON, le constructeur de la classe requise sera recherché avec le même ensemble de paramètres que dans l'objet JSON. Dans l'exemple ci-dessus, notre objet JSON est constitué de deux paramètres : name, id. Devinez quel constructeur il appellera. Et oui, si nous compilons ce code, cela générera une erreur, pourquoi ? Parce que nous avons limité la visibilité du constructeur (seuls les constructeurs avec le modificateur protected, public sont visibles). Si vous supprimez CreatorVisibility, cela fonctionnera. La question se pose. Qu'est-ce que @JsonProperty dans le constructeur ? Je pense que j'en parlerai dans la prochaine partie de l'article. PS Messieurs, j'aimerais vraiment obtenir au moins quelques réponses à propos de l'article. Je me demande si ce sujet est demandé et s'il vaut la peine de continuer, car il y a beaucoup de sujets et ils sont tous très intéressants. J'aimerais également considérer des annotations telles que @JsonView, @JsonManagedReference, @JsonBackReference, @JsonUnwrapped, etc. Merci :)
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION