Estoy tratando de incluir JSON sin procesar dentro de un objeto Java cuando el objeto se (des) serializa usando Jackson. Para probar esta funcionalidad, escribí la siguiente prueba:
public static class Pojo {
public String foo;
@JsonRawValue
public String bar;
}
@Test
public void test() throws JsonGenerationException, JsonMappingException, IOException {
String foo = "one";
String bar = "{\"A\":false}";
Pojo pojo = new Pojo();
pojo.foo = foo;
pojo.bar = bar;
String json = "{\"foo\":\"" + foo + "\",\"bar\":" + bar + "}";
ObjectMapper objectMapper = new ObjectMapper();
String output = objectMapper.writeValueAsString(pojo);
System.out.println(output);
assertEquals(json, output);
Pojo deserialized = objectMapper.readValue(output, Pojo.class);
assertEquals(foo, deserialized.foo);
assertEquals(bar, deserialized.bar);
}
El código genera la siguiente línea:
{"foo":"one","bar":{"A":false}}
El JSON es exactamente como quiero que se vean las cosas. Desafortunadamente, el código falla con una excepción al intentar volver a leer el JSON en el objeto. Esta es la excepción:
org.codehaus.jackson.map.JsonMappingException: no se puede deserializar la instancia de java.lang.String del token START_OBJECT en [Fuente: java.io.StringReader@d70d7a; línea: 1, columna: 13] (a través de la cadena de referencia: com.tnal.prism.cobalt.gather.testing.Pojo ["bar"])
¿Por qué Jackson funciona bien en una dirección pero falla cuando va en la otra dirección? Parece que debería poder tomar su propia salida como entrada nuevamente. Sé que lo que estoy tratando de hacer es poco ortodoxo (el consejo general es crear un objeto interno bar
que tenga una propiedad nombrada A
), pero no quiero interactuar con este JSON en absoluto. Mi código está actuando como un paso a través para este código: quiero tomar este JSON y enviarlo de nuevo sin tocar nada, porque cuando el JSON cambia, no quiero que mi código necesite modificaciones.
Gracias por el consejo.
EDITAR: Hizo de Pojo una clase estática, lo que estaba causando un error diferente.