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

Author: feeling abused and harassed, 2013-10-31

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);
 187
Author: icedtrees,
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.

 8
Author: Eric Barr,
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);
 4
Author: mumrah,
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_UNK‌​NOWN_PROPERTIES);
 3
Author: llambda,
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