Tôi đang cố gắng bao gồm JSON thô bên trong một đối tượng Java khi đối tượng được (de) được tuần tự hóa bằng Jackson. Để kiểm tra chức năng này, tôi đã viết bài kiểm tra sau:Làm cách nào để đưa JSON thô vào một đối tượng bằng 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);
}
Mã kết quả đầu ra dòng sau:
{"foo":"one","bar":{"A":false}}
Các JSON là chính xác làm thế nào tôi muốn điều cần xem xét. Thật không may, mã không thành công với một ngoại lệ khi cố đọc JSON trở lại đối tượng. Dưới đây là những ngoại lệ:
org.codehaus.jackson.map.JsonMappingException: Không thể deserialize thể hiện của java.lang.String ra khỏi START_OBJECT thẻ tại [Nguồn: [email protected]; 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 theo một hướng nhưng không thành công 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 một lần nữa. 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 cho bar
có một thuộc tính có tên là A
), nhưng tôi không muốn tương tác với JSON này chút nào. Mã của tôi đang hoạt động như một mã thông qua cho mã này - tôi muốn lấy JSON này và gửi nó trở lại mà không cần chạm vào một thứ, bởi vì khi các thay đổi JSON tôi không muốn mã của tôi cần sửa đổi.
Cảm ơn lời khuyên.
EDIT: Tạo Pojo là lớp tĩnh, gây ra lỗi khác.
Điều này hoạt động như một sự quyến rũ; xem phản ứng của tôi cho mã (_formatting trong các ý kiến là awgul_). –
Tôi đã có một trường hợp sử dụng khác cho việc này. Có vẻ như nếu chúng ta không muốn tạo ra rất nhiều chuỗi rác trong deser/ser, chúng ta sẽ có thể chỉ passthrough một chuỗi như vậy. Tôi đã thấy một chuỗi theo dõi điều này, nhưng có vẻ như không có hỗ trợ gốc nào có thể. Hãy xem http://markmail.org/message/qjncoohoalre4vd2#query:+page:1+mid:6ol54pw3zsr4jbhr+state:results – Sid
@Sid không có cách nào để thực hiện điều đó và mã hóa hiệu quả cả hai. Để hỗ trợ chuyển giao thông qua các mã thông báo chưa được xử lý sẽ yêu cầu bổ sung trạng thái giữ, làm cho việc phân tích cú pháp "thường xuyên" phần nào kém hiệu quả hơn. Nó là loại giống như tối ưu hóa giữa mã thông thường và ngoại lệ ném: để hỗ trợ sau này cho biết thêm chi phí cho trước đây. Jackson chưa được thiết kế để cố gắng giữ cho đầu vào chưa được xử lý sẵn có; nó sẽ được tốt đẹp để có nó (cho các thông báo lỗi, quá) xung quanh, nhưng sẽ yêu cầu cách tiếp cận khác nhau. – StaxMan