Estou tentando incluir JSON bruto dentro de um objeto Java quando o objeto é (des) serializado usando Jackson. Para testar essa funcionalidade, escrevi o seguinte teste:
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);
}
O código produz a seguinte linha:
{"foo":"one","bar":{"A":false}}
O JSON é exatamente como eu quero que as coisas pareçam. Infelizmente, o código falha com uma exceção ao tentar ler o JSON de volta para o objeto. Aqui está a exceção:
org.codehaus.jackson.map.JsonMappingException: Não é possível desserializar a instância de java.lang.String do token START_OBJECT em [Fonte: java.io.StringReader@d70d7a; linha: 1, coluna: 13] (por meio da cadeia de referência: com.tnal.prism.cobalt.gather.testing.Pojo ["bar"])
Por que Jackson funciona bem em uma direção, mas falha na direção oposta? Parece que ele deve ser capaz de obter sua própria saída como entrada novamente. Eu sei que o que estou tentando fazer é pouco ortodoxo (o conselho geral é criar um objeto interno para barque tenha uma propriedade chamada A), mas não quero interagir com esse JSON de forma alguma. Meu código está atuando como uma passagem para este código - quero pegar este JSON e enviá-lo de volta sem tocar em nada, porque quando o JSON muda, não quero que meu código precise de modificações.
Obrigado pelo conselho.
EDIT: Tornou Pojo uma classe estática, o que estava causando um erro diferente.