Convertir JsonNode en POJO

Resuelto Alexandre asked hace 10 años • 6 respuestas

Esto puede parecer un poco inusual, pero estoy buscando una manera eficiente de transformar/mapear a JsonNodeen 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 JsonNodesmi modelo.

Alexandre avatar Oct 31 '13 23:10 Alexandre
Aceptado

En Jackson 2.4, puedes convertir de la siguiente manera:

MyClass newJsonNode = jsonObjectMapper.treeToValue(someJsonNode, MyClass.class);

¿ Dónde jsonObjectMapperestá un Jackson ObjectMapper?


En versiones anteriores de Jackson, sería

MyClass newJsonNode = jsonObjectMapper.readValue(someJsonNode, MyClass.class);
icedtrees avatar Feb 25 '2015 08:02 icedtrees

Esto debería funcionar:

mapper.readValue(fileReader, MyClass.class);

Digo debería porque lo estoy usando con a String, no con BufferedReaderpero 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 POJOtiene 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.

Eric Barr avatar Oct 31 '2013 16:10 Eric Barr

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);
mumrah avatar Jan 06 '2015 02:01 mumrah