Convertir JsonNode en POJO
Esto puede parecer un poco inusual, pero estoy buscando una manera eficiente de transformar/mapear a JsonNode
en un POJO
.
Almaceno parte de la información de mi modelo en archivos json y tengo que admitir un par de versiones de mi modelo.
Lo que hago es cargar el archivo json en la memoria de un JsonNode, aplicar un par de estrategias de versionado para que coincida con la última versión de mi Modelo.
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);
A menos que haya una manera más rápida de hacerlo, probablemente terminaré simplemente aplicando manualmente a JsonNodes
mi modelo.
En Jackson 2.4, puedes convertir de la siguiente manera:
MyClass newJsonNode = jsonObjectMapper.treeToValue(someJsonNode, MyClass.class);
¿ Dónde jsonObjectMapper
está un Jackson ObjectMapper
?
En versiones anteriores de Jackson, sería
MyClass newJsonNode = jsonObjectMapper.readValue(someJsonNode, MyClass.class);
Esto debería funcionar:
mapper.readValue(fileReader, MyClass.class);
Digo debería porque lo estoy usando con a String
, no con BufferedReader
pero aún así debería funcionar.
Aquí está mi código:
String inputString = // I grab my string here
MySessionClass sessionObject;
try {
ObjectMapper objectMapper = new ObjectMapper();
sessionObject = objectMapper.readValue(inputString, MySessionClass.class);
Aquí está la documentación oficial para esa llamada: http://jackson.codehaus.org/1.7.9/javadoc/org/codehaus/jackson/map/ObjectMapper.html#readValue(java.lang.String, java.lang.Class)
También puede definir un deserializador personalizado cuando crea una instancia de ObjectMapper
:
http://wiki.fasterxml.com/JacksonHowToCustomDeserializers
Editar: acabo de recordar algo más. Si el objeto que ingresa tiene más propiedades que las que POJO
tiene y solo desea ignorar los extras, querrá configurar esto:
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
O recibirá un error que indica que no puede encontrar la propiedad para configurar.
Si está utilizando org.codehaus.jackson, esto es posible desde la versión 1.6. Puede convertir un JsonNode en un POJO con ObjectMapper#readValue
: http://jackson.codehaus.org/1.9.4/javadoc/org/codehaus/jackson/map/ObjectMapper.html#readValue(org.codehaus.jackson.JsonNode , java. idioma.clase)
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);