Benutzerdefinierte Deserialisierung der Liste mit Jackson

Ich versuche, mich zum schreiben eines benutzerdefinierten deserializer, um trim nach unten, einem großen Satz von Daten, die ich von woanders. Ich gebe eine Liste der benutzerdefinierten Objekte aus dem deserializer.

Meine Frage ist, wie mache ich dass, wenn dies ist meine benutzerdefinierte deserializer :

public class MyCustomDeserializer extends JsonDeserializer<List<CustomClass>> { ... }

Ich kann sicherlich nicht dies tun :

final SimpleModule module = new SimpleModule();
module.addDeserializer(List<CustomClass>.class, new MyCustomDeserializer());

Wird so etwas wie dieses arbeiten ?

final List<CustomClass> response = Arrays.asList(objectMapper.readValue(stringBean, CustomClass[].class));

Wenn das tatsächlich funktioniert, finde ich es ein wenig unübersichtlich und "gefährlich" ? Ist das nicht die Deserialisierung erfolgt im inneren des asList-Methode invocation ? Also es bildet im Prinzip eine Liste in ein array[] ?

Habe ich gelernt, über TypeReference so kann ich wohl verwenden, etwa so :

objectMapper.readValue(stringBean, new TypeReference<List<CustomClass>>(){});

aber ich habe gehört, es ist langsamer.

Ich auch nicht wollen, erstellen Sie einen container für die Liste, und, dass die Rückkehr in die Deserialisierung, weil das heißt, es wird eingewickelt in ein weiteres json-Objekt, und ich möchte einfach meine Endpunkt, etwas zu produzieren, wie :

[{object1}, {object2}]

//instead of

{"Output" : [{object1}, {object2}]}

EDIT:

Es scheint, dass ich falsch interpretiert, wie jackson mit meinem deserializer in beiden Fällen :

final List<CustomClass> response = Arrays.asList(objectMapper.readValue(stringBean, CustomClass[].class));
//or
objectMapper.readValue(stringBean, new TypeReference<List<CustomClass>>(){});

Sieht es aus wie der deserializer wird zweimal aufgerufen, einmal für jedes Objekt im array. Ich dachte, dass das gesamte array würde als ganzes betrachtet werden. Deaktivieren Sie die Verwirrung, hier ist was ich meine:

Json, die ich erhalten und versuchen zu Deserialisieren sieht so aus :

[
  {
    "Data" : {
      "id" : "someId",
      "otherThing" : "someOtherThing"
    },
    "Message" : "OK"
  },
  {
    "Data" : null,
    "Message" : "Object not found for id blabla"
  }
]

und so-ich dachte, das ist das, was ich in meinem deserializer, aber wie ich schon sagte, es scheint, dass ich eigentlich jeden "entry" aus diesem array und rufen Sie es mehrfach.

  • Müssen auch sagen, dass ich registriert deserializer auf die bean die @JsonDeserializer annotation.
  • Verwenden Sie die ObjectMapper's TypeFactory; es ermöglicht Ihnen, zu erstellen, geben Sie Beschreibungen, wie Sie wollen, das heißt, "eine Liste der CustomClass". Auch, erwähnen Sie bitte die version von Jackson, die Sie verwenden.
  • Ich bin mit jackson 2.4 version. Können Sie mir einige Materialien in Anwendung der Art factory-Methode ? Danke.
InformationsquelleAutor D.Razvan | 2015-12-09
Schreibe einen Kommentar