J'essaie d'inclure du JSON brut dans un objet Java lorsque l'objet est (dé) sérialisé à l'aide de Jackson. Afin de tester cette fonctionnalité, j'ai écrit le test suivant:
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);
}
Le code génère la ligne suivante:
{"foo":"one","bar":{"A":false}}
Le JSON est exactement ce à quoi je veux que les choses ressemblent. Malheureusement, le code échoue avec une exception lors de la tentative de lecture du JSON dans l'objet. Voici l'exception:
org.codehaus.jackson.map.JsonMappingException: impossible de désérialiser l'instance de java.lang.String à partir du jeton START_OBJECT à [Source: java.io.StringReader@d70d7a; ligne: 1, colonne: 13] (via la chaîne de référence: com.tnal.prism.cobalt.gather.testing.Pojo ["bar"])
Pourquoi Jackson fonctionne-t-il très bien dans une direction mais échoue dans l'autre direction? Il semble qu'il devrait être capable de reprendre sa propre sortie comme entrée. Je sais que ce que j'essaie de faire est peu orthodoxe (le conseil général est de créer un objet interne pour bar
qui a une propriété nommée A
), mais je ne veux pas du tout interagir avec ce JSON. Mon code agit comme un pass-through pour ce code - je veux récupérer ce JSON et le renvoyer sans rien toucher, car lorsque le JSON change, je ne veux pas que mon code ait besoin de modifications.
Merci pour le conseil.
EDIT: Fait de Pojo une classe statique, ce qui provoquait une erreur différente.