Sto cercando di includere JSON non elaborato all'interno di un oggetto Java quando l'oggetto è (de) serializzato utilizzando Jackson. Per testare questa funzionalità, ho scritto il seguente test:
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);
}
Il codice restituisce la seguente riga:
{"foo":"one","bar":{"A":false}}
Il JSON è esattamente come voglio che le cose appaiano. Sfortunatamente, il codice non riesce con un'eccezione quando si tenta di leggere nuovamente il JSON nell'oggetto. Ecco l'eccezione:
org.codehaus.jackson.map.JsonMappingException: impossibile deserializzare l'istanza di java.lang.String dal token START_OBJECT in [Origine: java.io.StringReader@d70d7a; riga: 1, colonna: 13] (attraverso la catena di riferimento: com.tnal.prism.cobalt.gather.testing.Pojo ["bar"])
Perché Jackson funziona bene in una direzione ma fallisce quando va nell'altra direzione? Sembra che dovrebbe essere in grado di prendere di nuovo il proprio output come input. So che quello che sto cercando di fare non è ortodosso (il consiglio generale è di creare un oggetto interno bar
che abbia una proprietà denominata A
), ma non voglio affatto interagire con questo JSON. Il mio codice funge da pass-through per questo codice: voglio prendere questo JSON e inviarlo di nuovo senza toccare nulla, perché quando il JSON cambia non voglio che il mio codice abbia bisogno di modifiche.
Grazie per il consiglio.
EDIT: ha reso Pojo una classe statica, che causava un errore diverso.