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 bar
que 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.