Próbuję dołączyć surowy kod JSON do obiektu Java, gdy obiekt jest (de) serializowany przy użyciu Jacksona. Aby przetestować tę funkcjonalność, napisałem następujący 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);
}
Kod wyświetla następujący wiersz:
{"foo":"one","bar":{"A":false}}
JSON jest dokładnie taki, jak chcę, aby wszystko wyglądało. Niestety, kod kończy się niepowodzeniem z wyjątkiem podczas próby odczytania JSON z powrotem do obiektu. Oto wyjątek:
org.codehaus.jackson.map.JsonMappingException: nie można deserializować instancji java.lang.String z START_OBJECT tokenu pod adresem [Źródło: java.io.StringReader@d70d7a; wiersz: 1, kolumna: 13] (przez łańcuch odniesienia: com.tnal.prism.cobalt.gather.testing.Pojo ["bar"])
Dlaczego Jackson działa dobrze w jednym kierunku, ale zawodzi, gdy idzie w drugim? Wygląda na to, że powinien być w stanie ponownie przyjąć własne wyjście jako dane wejściowe. Wiem, że to, co próbuję zrobić, jest nieortodoksyjne (ogólną radą jest utworzenie wewnętrznego obiektu, bar
który ma właściwość o nazwie A
), ale nie chcę w ogóle wchodzić w interakcje z tym JSONem. Mój kod działa jako przejście dla tego kodu - chcę pobrać ten JSON i wysłać go z powrotem bez dotykania niczego, ponieważ kiedy JSON się zmienia, nie chcę, aby mój kod wymagał modyfikacji.
Dzięki za radę.
EDYCJA: Zmieniono Pojo jako statyczną klasę, która powodowała inny błąd.