ฉันกำลังพยายามรวม JSON ดิบไว้ในออบเจ็กต์ Java เมื่ออ็อบเจ็กต์ (de) ต่ออนุกรมโดยใช้ Jackson เพื่อทดสอบฟังก์ชันนี้ฉันได้เขียนการทดสอบต่อไปนี้:
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);
}
โค้ดแสดงบรรทัดต่อไปนี้:
{"foo":"one","bar":{"A":false}}
JSON คือสิ่งที่ฉันต้องการ น่าเสียดายที่รหัสล้มเหลวโดยมีข้อยกเว้นเมื่อพยายามอ่าน JSON กลับไปที่ออบเจ็กต์ นี่คือข้อยกเว้น:
org.codehaus.jackson.map.JsonMappingException: ไม่สามารถ deserialize อินสแตนซ์ของ java.lang สตริงออกจากโทเค็น START_OBJECT ที่ [ที่มา: java.io.StringReader@d70d7a; บรรทัด: 1 คอลัมน์: 13] (ผ่านห่วงโซ่อ้างอิง: com.tnal.prism.cobalt.gather.testing.Pojo ["bar"])
ทำไมแจ็คสันถึงทำงานได้ดีในทิศทางเดียว แต่ล้มเหลวเมื่อไปอีกทิศทาง ดูเหมือนว่ามันควรจะสามารถเอาเอาต์พุตของตัวเองเป็นอินพุตได้อีกครั้ง ฉันรู้ว่าสิ่งที่ฉันพยายามทำนั้นนอกรีต (คำแนะนำทั่วไปคือการสร้างวัตถุภายในสำหรับbar
สิ่งนั้นที่มีชื่อคุณสมบัติA
) แต่ฉันไม่ต้องการโต้ตอบกับ JSON นี้เลย รหัสของฉันทำหน้าที่เป็นรหัสผ่านสำหรับรหัสนี้ - ฉันต้องการรับ JSON นี้และส่งกลับออกไปอีกครั้งโดยไม่ต้องสัมผัสอะไรเลยเพราะเมื่อ JSON เปลี่ยนแปลงฉันไม่ต้องการให้รหัสของฉันต้องแก้ไข
ขอบคุณสำหรับคำแนะนำ.
แก้ไข: ทำให้ Pojo เป็นคลาสแบบคงที่ซึ่งทำให้เกิดข้อผิดพลาดอื่น