2011-08-08 31 views
10

Tôi đã có các lớp sau:Jackson JSON không quấn thuộc tính của đối tượng lồng nhau

public class Container { 
    private String name; 
    private Data data; 
} 

public class Data { 
    private Long id; 
} 

Khi tôi serialize Container lớp sử dụng Jackson tôi nhận được

{"name":"Some name","data":{"id":1}} 

Nhưng tôi cần kết quả là:

{"name":"Some name","id":1} 

Có thể (không thêm phương thức Container.getDataId()) không? Nếu vậy, làm thế nào để làm điều đó?


cập nhật

tôi đã cố gắng để tạo ra tùy chỉnh JsonSerializer<Data> nhưng kết quả là giống như trước

public class JsonDataSerializer extends JsonSerializer<Data> { 

    private static Logger logger = Logger.getLogger(JsonDataSerializer.class); 

    @Override 
    public void serialize(Data value, JsonGenerator jgen, 
      SerializerProvider provider) 
      throws IOException,JsonProcessingException { 

     Long id = (value.getId() == null) ? 0l : value.getId(); 
     jgen.writeStartObject(); 
     jgen.writeNumberField("id", id); 
     jgen.writeEndObject(); 
     logger.debug("Data id " + id + " serialized to JSON.");  
    } 
} 

Tôi cũng đã cố gắng thêm @JsonSerialize chú thích trên Data lớp, sau đó trên getter trong lớp Container. Như tôi đã đề cập trước đây mà không có bất kỳ thành công nào. Trình nối tiếp của tôi được sử dụng, thông điệp nhật ký nhật ký.


cập nhật 2

Khi tôi loại bỏ writeStartObject()writeEndObject() sau đó không JSON là returnesd, chỉ HTTP Status 500 lỗi và không có ngoại lệ được ném ngoại trừ những gì tôi tìm thấy trong kết xuất debug.

DEBUG: org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver - Resolving exception from handler [[email protected]]: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Can not write a field name, expecting a value; nested exception is org.codehaus.jackson.JsonGenerationException: Can not write a field name, expecting a value 
DEBUG: org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver - Resolving exception from handler [[email protected]]: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Can not write a field name, expecting a value; nested exception is org.codehaus.jackson.JsonGenerationException: Can not write a field name, expecting a value 
DEBUG: org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver - Resolving exception from handler [[email protected]]: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Can not write a field name, expecting a value; nested exception is org.codehaus.jackson.JsonGenerationException: Can not write a field name, expecting a value 
+0

điều gì sẽ xảy ra nếu bạn bỏ qua các dòng writeStartObject() và writeEndObject()? –

+1

bạn có lẽ chỉ cần viết giá trị: writeNumber (id) –

+0

Có, ghi bằng cách sử dụng chỉ 'writeNumber (id)' làm việc ít nhất là một số trường hợp. Dữ liệu đầu ra là "" dữ liệu ": 1'. Nhưng nếu tôi muốn tuần tự hóa nhiều hơn thì một thuộc tính trong lớp 'Dữ liệu'? Tôi đã cố gắng thêm các phương thức 'write * Field' có và không có' write {Start, End} Object' mà không có may mắn – kurochenko

Trả lời

9

Jackson 1.9 đã giới thiệu JsonUnwrapped chú thích mà làm những gì bạn đang tìm kiếm.

0

Tôi nghĩ bạn phải tạo và đăng ký trình nối tiếp tùy chỉnh cho loại Dữ liệu.

Bạn có thể sử dụng chú thích @JsonSerialize trên lớp Dữ liệu.

Chỉ định một lớp serializer:

@JsonSerialize(using = MyDataSerializer.class) 
public class Data { 
    ... 
} 

public static class MyDataSerializer extends JsonSerializer<Data> { 

    @Override 
    public void serialize(Data value, JsonGenerator jgen, 
      SerializerProvider provider) throws IOException,JsonProcessingException { 
     jgen.writeNumberField("id", value.id); 
    } 
+0

Cảm ơn bạn đã trả lời! Tôi đã cố gắng làm những gì bạn đã viết (xem câu hỏi được cập nhật), nhưng tiếc là kết quả cũng giống như trước đây. – kurochenko

Các vấn đề liên quan