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
4 réponses
Dans Jackson 2.4, Vous pouvez convertir comme suit:
MyClass newJsonNode = jsonObjectMapper.treeToValue(someJsonNode, MyClass.class);
Où jsonObjectMapper
est un Jackson ObjectMapper
.
Dans les anciennes versions de Jackson, ce serait
MyClass newJsonNode = jsonObjectMapper.readValue(someJsonNode, MyClass.class);
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.
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);
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_UNKNOWN_PROPERTIES);