2012-03-19 27 views
23

Tôi đang sử dụng Gson để tạo debug ouput trong ứng dụng của tôibãi đối tượng String với Jackson

Gson gson = new GsonBuilder().setPrettyPrinting().serializeNulls().create(); 
gson.toJson(myObject); 

Nhưng Gson không phàn nàn về một lỗi tham chiếu vòng tròn khi cố gắng serialize một cấu trúc dữ liệu. Điều này có thể được thực hiện với thư viện Jackson không?

UPD Gson 2.3.1: Phát hành Tháng Mười Một 20, 2014

Added support to serialize objects with self-referential fields. The self-referential field is set to null in JSON. Previous version of Gson threw a StackOverflowException on encountering any self-referential fields. 
    The most visible impact of this is that Gson can now serialize Throwable (Exception and Error) 

Trả lời

31

Để serialize với Jackson:

public String serialize(Object obj, boolean pretty) { 
    ObjectMapper mapper = new ObjectMapper(); 

    mapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false); 

    if (pretty) { 
     return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj); 
    } 

    return mapper.writeValueAsString(obj); 
} 
+0

đối số đầu tiên của configure() phương pháp nên được 'SerializationFeature.FAIL_ON_EMPTY_BEANS' hiện . Phương thức serialize() của bạn phải có 'throws JsonProcessingException' hoặc try/catch block – kiedysktos

10

Jackson có thể đối phó với chu kỳ trong đồ thị đối tượng với:

  1. @JsonIgnore, nơi bạn bỏ qua quảng cáo rty hoàn toàn
  2. @JsonManagedReference@JsonBackReference
  3. một tùy chỉnh Serializer kéo dài JsonSerializer

Bạn sẽ sử dụng JsonSerializer khi bạn vẫn muốn cung cấp một số thông tin về các đối tượng, nhưng muốn bỏ qua lĩnh vực nhất định (những người gây ra chu kỳ). Ví dụ:

import org.codehaus.jackson.map.JsonSerializer 
import org.codehaus.jackson.JsonGenerator; 
import org.codehaus.jackson.JsonProcessingException; 
import org.codehaus.jackson.map.SerializerProvider; 

import java.io.IOException; 

public class ParentReferenceSerializer extends JsonSerializer<Parent> { 
    @Override 
    public void serialize(Parent parent, JsonGenerator jgen, 
     SerializerProvider provider) 
      throws IOException, JsonProcessingException { 
     jgen.writeStartObject(); 
     writeNumberField(jgen, "id", parent.getId()); 
     // ... other fields ... 
     jgen.writeEndObject(); 
    } 
} 

Sau đó, trong lớp học, trong đó đã được đăng, bạn muốn sử dụng một chú thích @JsonSerialize:

@JsonSerialize(using = ParentReferenceSerializer.class) 
public Parent getParent() { 
    return parent; 
} 
Các vấn đề liên quan