Saya mencoba memasukkan JSON mentah di dalam objek Java ketika objek tersebut (de) diserialisasi menggunakan Jackson. Untuk menguji fungsionalitas ini, saya menulis tes berikut:
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);
}
Kode mengeluarkan baris berikut:
{"foo":"one","bar":{"A":false}}
JSON persis seperti yang saya inginkan. Sayangnya, kode gagal dengan pengecualian saat mencoba membaca JSON kembali ke objek. Berikut pengecualiannya:
org.codehaus.jackson.map.JsonMappingException: Tidak dapat mendelialisasi instance java.lang.String dari token START_OBJECT di [Sumber: java.io.StringReader@d70d7a; baris: 1, kolom: 13] (melalui rantai referensi: com.tnal.prism.cobalt.gather.testing.Pojo ["bar"])
Mengapa Jackson berfungsi dengan baik di satu arah tetapi gagal saat pergi ke arah lain? Sepertinya itu harus dapat mengambil keluarannya sendiri sebagai masukan lagi. Saya tahu apa yang saya coba lakukan tidak ortodoks (saran umumnya adalah membuat objek dalam bar
yang memiliki properti bernama A
), tetapi saya sama sekali tidak ingin berinteraksi dengan JSON ini. Kode saya bertindak sebagai penerusan untuk kode ini - Saya ingin mengambil JSON ini dan mengirimkannya kembali tanpa menyentuh apa pun, karena ketika JSON berubah, saya tidak ingin kode saya perlu dimodifikasi.
Terima kasih atas sarannya.
EDIT: Menjadikan Pojo kelas statis, yang menyebabkan kesalahan berbeda.