Я намагаюся включити сирий JSON всередині об’єкта Java, коли об’єкт (де) серіалізується за допомогою Джексона. Щоб перевірити цю функціональність, я написав такий тест:
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);
}
Код виводить такий рядок:
{"foo":"one","bar":{"A":false}}
JSON - це саме те, як я хочу, щоб речі виглядали. На жаль, код не вдається за винятком при спробі прочитати JSON назад в об'єкт. Ось виняток:
org.codehaus.jackson.map.JsonMappingException: не вдається десеріалізувати примірник java.lang.String з START_OBJECT маркера на [Джерело: java.io.StringReader@d70d7a; рядок: 1, стовпець: 13] (через посилання ланцюга: com.tnal.prism.cobalt.gather.testing.Pojo ["бар"])
Чому Джексон функціонує просто в одному напрямку, але не працює, коли рухається в іншому напрямку? Здається, що він повинен мати можливість знову взяти власну продукцію як вхід. Я знаю, що я намагаюся зробити - це неортодоксальність (загальна порада - створити внутрішній об’єкт, bar
який має властивість з назвою A
), але я взагалі не хочу взаємодіяти з цим JSON. Мій код виконує функцію пропуску цього коду - я хочу взяти цей JSON і знову надіслати його, не торкаючись жодної речі, тому що, коли JSON змінюється, я не хочу, щоб мій код не потребував змін.
Дякую за пораду.
EDIT: Зробив Pojo статичним класом, який спричинив інші помилки.