使用Jackson将对象转换为字符串

32

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

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

但是Gson在尝试序列化数据结构时会抱怨循环引用错误。使用Jackson库可以解决这个问题吗?

更新 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)
2个回答

40

使用Jackson进行序列化:

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

    mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

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

    return mapper.writeValueAsString(obj);
}

1
configure() 方法的第一个参数应该是 SerializationFeature.FAIL_ON_EMPTY_BEANS。您的 serialize() 方法应该有 throws JsonProcessingException 或者 try/catch 块。 - kiedysktos
我的配置行最终变成了这样:mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); - Chris Thornton

11

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接