Convertir JsonNode en POJO

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

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

Ce que je fais est de charger le fichier json en mémoire dans un JsonNode, appliquer quelques stratégies de gestion des 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);

À moins qu'il n'y ait un moyen plus rapide de le faire, je finirai probablement par appliquer simplement manuellement le JsonNodes à mon modèle

93
demandé sur feeling abused and harassed 2013-10-31 20:18:38

4 réponses

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, ce serait

MyClass newJsonNode = jsonObjectMapper.readValue(someJsonNode, MyClass.class);
187
répondu icedtrees 2015-03-15 12:18:47

Cela devrait faire l'affaire:

mapper.readValue(fileReader, MyClass.class);

Je dis devrait parce que je l'utilise avec un String, pas un BufferedReader mais cela devrait toujours 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 pour cet appel: http://jackson.codehaus.org/1.7.9/javadoc/org/codehaus/jackson/map/ObjectMapper.html#readValue(java.lang.String, java.lang.Classe)

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

Modifier: Je viens de me rappeler quelque chose d'autre. Si votre objet entrant a plus de propriétés que le POJO et que vous voulez juste 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 peut pas trouver la propriété à définir.

8
répondu Eric Barr 2013-10-31 18:23:13

Si vous utilisez org.codehaus.jackson, c'est possible depuis 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.Classe)


    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
répondu mumrah 2015-01-06 02:18:08
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 a plus de propriétés que votre POJO et que vous voulez juste ignorer les extras dans Jackson 2.4, Vous pouvez configurer votre ObjectMapper comme suit. cette syntaxe est différente des anciennes versions de Jackson. (Si vous utilisez la mauvaise syntaxe, il ne fera rien en silence.)

mapper.disable(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNK‌​NOWN_PROPERTIES);
3
répondu llambda 2014-10-14 22:17:02