Como posso incluir JSON bruto em um objeto usando Jackson?
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 gera a seguinte linha:
{"foo":"one","bar":{"A":false}}
O JSON é exatamente como eu quero que as coisas sejam. Infelizmente, o código falha com uma exceção ao tentar ler o JSON novamente no 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] (através da cadeia de referência: com.tnal.prism.cobalt.gather.testing.Pojo ["bar"])
Por que Jackson funciona muito bem em uma direção, mas falha ao ir na outra direção? Parece que ele deve ter sua própria saída como entrada novamente. Sei que o que estou tentando fazer não é ortodoxo (o conselho geral é criar um objeto interno parabar
que tem uma propriedade chamadaA
), mas não quero interagir com este JSON. Meu código está atuando como uma passagem para esse código - quero pegar esse JSON e enviá-lo novamente 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 o Pojo uma classe estática, o que estava causando um erro diferente.