Convertir JsonNode en POJO
Esto puede parecer un poco inusual, pero estoy buscando una manera eficiente de transformar/mapear a JsonNode
en a 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 memoria en un JsonNode, aplicar un par de estrategias de control de versiones 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 forma más rápida de hacerlo, probablemente terminaré simplemente aplicando manualmente el JsonNodes
a mi Modelo
4 answers
En Jackson 2.4, puede convertir de la siguiente manera:
MyClass newJsonNode = jsonObjectMapper.treeToValue(someJsonNode, MyClass.class);
Donde jsonObjectMapper
es un Jackson ObjectMapper
.
En versiones anteriores de Jackson, sería
MyClass newJsonNode = jsonObjectMapper.readValue(someJsonNode, MyClass.class);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-15 12:18:47
Esto debería hacer el truco:
mapper.readValue(fileReader, MyClass.class);
Digo debería porque estoy usando eso con un String
, no un BufferedReader
pero debería seguir funcionando.
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 instancie el ObjectMapper
:
http://wiki.fasterxml.com/JacksonHowToCustomDeserializers
Editar:
Acabo de recordar algo más. Si su objeto que viene tiene más propiedades que el POJO
tiene y solo desea ignorar los extras, querrá establecer esto:
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
O obtendrá un error que no puede encontrar la propiedad para establecer.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-31 18:23:13
Si estás usando org.codehaus.jackson, esto ha sido posible desde 1.6. Puede convertir un JsonNode a 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.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);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
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 su entrada JSON tiene más propiedades que su POJO y solo desea ignorar los extras en Jackson 2.4, puede configurar su ObjectMapper de la siguiente manera. Esta sintaxis es diferente de las versiones anteriores de Jackson. (Si usa la sintaxis incorrecta, silenciosamente no hará nada.)
mapper.disable(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-14 22:17:02