Tôi đang cố gắng đưa JSON thô vào bên trong một đối tượng Java khi đối tượng được (de) tuần tự hóa bằng cách sử dụng Jackson. Để kiểm tra chức năng này, tôi đã viết bài kiểm tra sau:
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);
}
Mã xuất ra dòng sau:
{"foo":"one","bar":{"A":false}}
JSON chính xác là cách tôi muốn mọi thứ trông như thế nào. Thật không may, mã không thành công với một ngoại lệ khi cố gắng đọc lại JSON vào đối tượng. Đây là ngoại lệ:
org.codehaus.jackson.map.JsonMappingException: Không thể giải mã hóa phiên bản java.lang.String ra khỏi mã thông báo START_OBJECT tại [Nguồn: java.io.StringReader@d70d7a; dòng: 1, cột: 13] (thông qua chuỗi tham chiếu: com.tnal.prism.cobalt.gather.testing.Pojo ["bar"])
Tại sao Jackson hoạt động tốt ở một hướng nhưng lại thất bại khi đi theo hướng khác? Có vẻ như nó sẽ có thể lấy lại đầu ra của chính nó làm đầu vào. Tôi biết những gì tôi đang cố gắng làm là không chính thống (lời khuyên chung là tạo một đối tượng bên trong bar
có thuộc tính được đặt tên A
), nhưng tôi không muốn tương tác với JSON này. Mã của tôi đang hoạt động như một mã chuyển tiếp cho mã này - Tôi muốn lấy JSON này và gửi lại nó một lần nữa mà không cần chạm vào bất kỳ thứ gì, bởi vì khi JSON thay đổi, tôi không muốn mã của mình cần sửa đổi.
Cảm ơn vì lời khuyên.
CHỈNH SỬA: Đã tạo cho Pojo một lớp tĩnh, lớp này đang gây ra một lỗi khác.