【问题标题】:dump object to String with Jackson与杰克逊一起将对象转储到字符串
【发布时间】:2012-03-19 08:43:04
【问题描述】:

我正在使用 Gson 在我的应用程序中生成调试输出

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

但 Gson 在尝试序列化数据结构时确实会抱怨循环引用错误。 这可以用 Jackson 库来完成吗?

UPD Gson 2.3.1:2014 年 11 月 20 日发布

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)

【问题讨论】:

    标签: java jackson gson


    【解决方案1】:

    使用 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);
    }
    

    【讨论】:

    • configure() 方法的第一个参数当前应该是SerializationFeature.FAIL_ON_EMPTY_BEANS。你的 serialize() 方法应该有 throws JsonProcessingException 或 try/catch 块
    • 我的配置行最终是这样的:mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
    【解决方案2】:

    Jackson 可以处理对象图中的循环:

    1. @JsonIgnore,您完全省略了该属性
    2. @JsonManagedReference@JsonBackReference
    3. 扩展JsonSerializer的自定义序列化程序

    当您仍希望提供有关对象的一些信息但想省略某些字段(导致循环的字段)时,您可以使用JsonSerializer。例如:

    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();
        }
    }
    

    然后在被序列化的类中,您将使用@JsonSerialize 注释:

    @JsonSerialize(using = ParentReferenceSerializer.class)
    public Parent getParent() {
        return parent;
    }
    

    【讨论】:

      猜你喜欢
      • 2014-03-05
      • 2017-10-03
      • 2017-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-28
      • 1970-01-01
      相关资源
      最近更新 更多