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.
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, il serait
MyClass newJsonNode = jsonObjectMapper.readValue(someJsonNode, MyClass.class);
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.
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);
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_UNKNOWN_PROPERTIES);