Я пытаюсь включить необработанный 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"])
Почему Джексон прекрасно работает в одном направлении, но терпит неудачу при движении в другом направлении? Похоже, он снова сможет принимать собственный вывод в качестве ввода. Я знаю, что то, что я пытаюсь сделать, является необычным (общий совет - создать внутренний объект, для bar
которого есть свойство с именемA
), но я вообще не хочу взаимодействовать с этим JSON. Мой код действует как сквозной канал для этого кода - я хочу принять этот JSON и отправить его снова, не касаясь ничего, потому что при изменении JSON я не хочу, чтобы мой код нуждался в модификациях.
Спасибо за совет.
EDIT: сделал Pojo статическим классом, который вызывал другую ошибку.