Convertir JsonNode en POJO

Esto puede parecer un poco inusual, pero estoy buscando una manera eficiente de transformar / mapear un JsonNode en un POJO.

Almaceno parte de la información de mi modelo en archivos json y tengo que soportar un par de versiones de mi modelo.

Lo que hago es cargar el fichero json en memoria en 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 forma más rápida de hacerlo, probablemente acabaré aplicando manualmente los JsonNodes a mi Modelo.

Con esto debería bastar:

mapper.readValue(fileReader, MyClass.class);

Digo debería porque lo estoy usando con un String, no con un BufferedReader pero 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 puedes definir un deserializador personalizado cuando instancias el ObjectMapper: http://wiki.fasterxml.com/JacksonHowToCustomDeserializers

Edito: Acabo de recordar algo más. Si tu objeto tiene más propiedades de las que tiene el POJO y quieres ignorar las extras, tendrás que definir esto:

    objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

O usted'll obtener un error que no puede'encontrar la propiedad para establecer en.

Comentarios (4)

Si usas org.codehaus.jackson, esto es posible desde la versión 1.6. Puedes 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.lang.Class)


    ObjectMapper mapper = new ObjectMapper();
    JsonParser jsonParser = mapper.getJsonFactory().createJsonParser("{\"foo\":\"bar\"}");
    JsonNode tree = jsonParser.readValueAsTree();
    // Hacer cosas con el árbol
    mapper.readValue(tree, Foo.class);
Comentarios (3)
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 tu entrada JSON tiene más propiedades que tu POJO y quieres ignorar los extras en Jackson 2.4, puedes configurar tu ObjectMapper como sigue. Esta sintaxis es diferente de versiones anteriores de Jackson. (Si usas la sintaxis incorrecta, silenciosamente no hará nada).

mapper.disable(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNK‌​NOWN_PROPERTIES);
Comentarios (0)