web-dev-qa-db-fra.com

Convertir JsonNode en POJO

Cela peut sembler un peu inhabituel, mais je cherche un moyen efficace de transformer/mapper une JsonNode en une POJO.

Je stocke certaines informations de mon modèle dans des fichiers JSON et je dois prendre en charge plusieurs versions de mon modèle.

Ce que je fais est de charger le fichier JSON en mémoire dans un JsonNode, d’appliquer quelques stratégies de gestion de versions pour le faire correspondre à la dernière version de mon modèle.

    ObjectMapper mapper = new ObjectMapper();
    BufferedReader fileReader = new BufferedReader(new FileReader(projPath));

    JsonNode rootNode = mapper.readTree(fileReader);

    //Upgrade our file in memory
    applyVersioningStrategy(rootNode);

    ProjectModel project = mapJsonNodeToProject(rootNode);

Sauf s'il existe un moyen plus rapide de le faire, je vais probablement finir par appliquer manuellement le JsonNodes à mon modèle.

126
Alexandre

Dans Jackson 2.4, vous pouvez convertir comme suit:

MyClass newJsonNode = jsonObjectMapper.treeToValue(someJsonNode, MyClass.class);

jsonObjectMapper est un Jackson ObjectMapper.


Dans les anciennes versions de Jackson, il serait

MyClass newJsonNode = jsonObjectMapper.readValue(someJsonNode, MyClass.class);
231
icedtrees

Cela devrait faire l'affaire:

mapper.readValue(fileReader, MyClass.class);

Je dis devrait parce que j'utilise cela avec un String, pas un BufferedReader mais cela devrait quand même fonctionner.

Voici mon code:

String inputString = // I grab my string here
MySessionClass sessionObject;
try {
    ObjectMapper objectMapper = new ObjectMapper();
    sessionObject = objectMapper.readValue(inputString, MySessionClass.class);

Voici la documentation officielle de cet appel: http://jackson.codehaus.org/1.7.9/javadoc/org/codehaus/jackson/map/ObjectMapper.html#readValue (Java.lang.String, Java.). lang.Class)

Vous pouvez également définir un désérialiseur personnalisé lorsque vous instanciez la ObjectMapper: http://wiki.fasterxml.com/JacksonHowToCustomDeserializers

Edit: Je viens de rappeler quelque chose d'autre. Si votre objet entrant a plus de propriétés que le POJO et que vous voulez simplement ignorer les extras, vous voudrez définir ceci:

    objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

Ou vous obtiendrez une erreur dans laquelle il ne trouvera pas la propriété à définir.

8
Eric Barr

Si vous utilisez org.codehaus.jackson, cela est possible depuis la version 1.6. Vous pouvez convertir un JsonNode en POJO avec ObjectMapper#readValue: http://jackson.codehaus.org/1.9.4/javadoc/org/codehaus/jackson/map/ObjectMapper.html#readValue (org .codehaus.jackson.JsonNode , Java.lang.Class)


    ObjectMapper mapper = new ObjectMapper();
    JsonParser jsonParser = mapper.getJsonFactory().createJsonParser("{\"foo\":\"bar\"}");
    JsonNode tree = jsonParser.readValueAsTree();
    // Do stuff to the tree
    mapper.readValue(tree, Foo.class);
4
mumrah
String jsonInput = "{ \"hi\": \"Assume this is the JSON\"} ";
com.fasterxml.jackson.databind.ObjectMapper mapper =
    new com.fasterxml.jackson.databind.ObjectMapper();
MyClass myObject = objectMapper.readValue(jsonInput, MyClass.class);

Si votre entrée JSON dans possède plus de propriétés que votre POJO et que vous souhaitez simplement ignorer les extras de Jackson 2.4, vous pouvez configurer votre ObjectMapper comme suit. Cette syntaxe est différente des anciennes versions de Jackson. (Si vous utilisez une syntaxe incorrecte, cela ne fera rien en silence.)

mapper.disable(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNK‌​NOWN_PROPERTIES);
3
llambda