JavaRush /Java-Blog /Random-DE /Einführung in das Jackson Framework
Mikhail Fufaev
Level 35
Москва

Einführung in das Jackson Framework

Veröffentlicht in der Gruppe Random-DE
In einer kalten Frühlingsnacht erreichte ich endlich Level 33. Ich rieb mir die Hände eines Programmierers und bereitete mich bereits darauf vor, das gesamte Gebiet der JSON-Serialisierung und -Deserialisierung zu erforschen, aber leider verstand ich nichts. Ich konnte mich nicht an den Text der Vorlesung erinnern, aber die Probleme wurden irgendwie intuitiv gelöst. In diesem Zusammenhang habe ich beschlossen, in die Wildnis des Jackson Framework einzutauchen und herauszufinden, was dieser JSON ist.
Jackson-Framework
Ich werde versuchen, mein gesamtes Wissen praktisch und prägnant in einem Spickzettelformat darzustellen (sowohl für mich selbst als auch für die Leser). Reise zu Jackson Anmerkungen. Das erste, was uns auf dem Weg zu JSON begegnet, ist die Annotation @JsonAutoDetect. Auf den ersten Blick ist es eine einfache Zusammenfassung, aber der Autor hat am längsten gebraucht, um sie herauszufinden. Die Zusammenfassung enthält 5 Methoden, die wir benötigen:
  • fieldVisibility () – Serialisiert nur Felder mit dem angegebenen Zugriffsmodifikator
  • getterVisibility()/setterVisibility() – serialisiert Felder, deren Getter/Setter den angegebenen Zugriffsmodifikator hat
  • isGetterVisibility() – separate Implementierung für boolesche Getter
Es ist wichtig zu verstehen, dass die Methoden disjunktiv funktionieren. Diese. Wenn das Feld mit mindestens einem der in der Anmerkung angegebenen Parameter übereinstimmt, wird es in JSON aufgenommen. Versuchen Sie zu beantworten, was dieser Code ausgibt, wenn wir eine Instanz mit einem parameterlosen Konstruktor erstellen:
@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;
    }
}
Was passiert, wenn wir isGetterVisibility entfernen? Die vier aufgeführten Methoden konfigurierten den Serialisierungsprozess. Der fünfte wiederum regelt den Deserialisierungsprozess:
  • CreatorVisibility() ist die am schwierigsten zu verstehende Methode. Es funktioniert mit Konstruktoren und mit Factory-Methoden (Methoden, die beim Aufruf ein Objekt erstellen). Schauen wir uns ein Beispiel an:
@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);
}
Wichtiger Hinweis zum Deserialisierungsmechanismus! Wenn wir versuchen, ein Objekt aus JSON zu erstellen, wird der Konstruktor der erforderlichen Klasse mit demselben Parametersatz wie im JSON-Objekt durchsucht. Im obigen Beispiel besteht unser JSON-Objekt aus zwei Parametern: Name, ID. Erraten Sie, welchen Konstruktor es aufrufen wird. Und ja, wenn wir diesen Code kompilieren, wird ein Fehler ausgegeben. Warum? Weil wir die Sichtbarkeit des Konstruktors eingeschränkt haben (nur Konstruktoren mit dem geschützten, öffentlichen Modifikator sind sichtbar). Wenn Sie CreatorVisibility entfernen, funktioniert es. Es stellt sich die Frage. Was ist @JsonProperty im Konstruktor? Ich denke, ich werde im nächsten Teil des Artikels darüber sprechen. PS Meine Herren, ich würde wirklich gerne zumindest eine Reaktion auf den Artikel bekommen. Ich frage mich, ob dieses Thema gefragt ist und ob es sich lohnt, weiterzumachen, denn es gibt viele Themen und sie sind alle sehr interessant. Ich würde auch gerne Annotationen wie @JsonView, @JsonManagedReference, @JsonBackReference, @JsonUnwrapped usw. berücksichtigen. Danke :)
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION