Heim >Java >javaLernprogramm >Wie deserialisiere ich polymorphes JSON mit Jacksons ObjectMapper ohne Kompilierungsfehler?

Wie deserialisiere ich polymorphes JSON mit Jacksons ObjectMapper ohne Kompilierungsfehler?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-24 16:36:11862Durchsuche

How to Deserialize Polymorphic JSON Using Jackson's ObjectMapper without Compilation Errors?

Jackson und polymorphes JSON: Beheben von Kompilierungsfehlern bei der ObjectNode-Deserialisierung

Diese Untersuchung versucht, einen Kompilierungsfehler zu beheben, der bei der Deserialisierung von polymorphem JSON mit Jacksons auftritt ObjectMapper. Konkret liegt der Fehler in der Zeile:

return mapper.readValue(root, animalClass);

Erklärung des Problems:

Der Fehler ist auf eine Nichtübereinstimmung zwischen der Methodensignatur von readValue() und den Argumenten zurückzuführen bereitgestellt. readValue() erwartet zwei Argumente: einen JsonParser und eine Klasse, aber in diesem Code werden ein ObjectNode (kein JsonParser) und ein Subtyp von Animal (nicht Animal selbst) übergeben.

Annotation- Basierende Polymorphismus-Lösung:

Als Alternative zum im Tutorial erwähnten registrierungsbasierten Ansatz sollten Sie die Verwendung von Jackson in Betracht ziehen Annotationsbasierter Ansatz für die polymorphe Deserialisierung. Dies beinhaltet:

  1. Annotieren der Animal-Klasse: Verwenden Sie @JsonTypeInfo, um zu definieren, wie Typinformationen im JSON gespeichert werden, zusammen mit @JsonSubTypes, um die möglichen Untertypen anzugeben.
  2. Annotieren der Unterklassen (z. B. Hund und Katze):Verwenden Sie @JsonTypeId um den Namen der Eigenschaft zu definieren, die die Typinformationen enthält.

Beispielimplementierung:

// An abstract base class for animals
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY)
@JsonSubTypes({
  @JsonSubTypes.Type(value = Dog.class, name = "Dog"),
  @JsonSubTypes.Type(value = Cat.class, name = "Cat")
})
public abstract class Animal { ... }

// Subclass for dogs
public class Dog extends Animal { ... }

// Subclass for cats
public class Cat extends Animal { ... }

// Test class
public class Test {

  public static void main(String[] args) {
    ObjectMapper mapper = new ObjectMapper();
    ... // Serialize and deserialize animals as shown in the provided solution
  }
}

Durch die Verwendung von Anmerkungen kann Jackson auf den Typ von schließen das Objekt basierend auf den bereitgestellten Typinformationen im JSON, wodurch die Notwendigkeit einer Registrierung vermieden und der Kompilierungsfehler behoben wird.

Das obige ist der detaillierte Inhalt vonWie deserialisiere ich polymorphes JSON mit Jacksons ObjectMapper ohne Kompilierungsfehler?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn