gson 使用Jackson将对象转储到字符串

0ejtzxu1  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(194)

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

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

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

UPDGson 2.3.1版:2014年11月20日发布

  1. 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.
  2. The most visible impact of this is that Gson can now serialize Throwable (Exception and Error)
ql3eal8s

ql3eal8s1#

要使用Jackson进行序列化,请执行以下操作:

  1. public String serialize(Object obj, boolean pretty) {
  2. ObjectMapper mapper = new ObjectMapper();
  3. mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
  4. if (pretty) {
  5. return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
  6. }
  7. return mapper.writeValueAsString(obj);
  8. }
gjmwrych

gjmwrych2#

Jackson可以用以下方法处理对象图中的循环:

  1. @JsonIgnore,其中完全省略属性
  2. @JsonManagedReference@JsonBackReference的函数
    1.自定义序列化程序,它扩展JsonSerializer
    当您仍然希望提供有关对象的一些信息,但希望忽略某些字段(导致循环的字段)时,可以使用JsonSerializer。例如:
  1. import org.codehaus.jackson.map.JsonSerializer
  2. import org.codehaus.jackson.JsonGenerator;
  3. import org.codehaus.jackson.JsonProcessingException;
  4. import org.codehaus.jackson.map.SerializerProvider;
  5. import java.io.IOException;
  6. public class ParentReferenceSerializer extends JsonSerializer<Parent> {
  7. @Override
  8. public void serialize(Parent parent, JsonGenerator jgen,
  9. SerializerProvider provider)
  10. throws IOException, JsonProcessingException {
  11. jgen.writeStartObject();
  12. writeNumberField(jgen, "id", parent.getId());
  13. // ... other fields ...
  14. jgen.writeEndObject();
  15. }
  16. }

然后,在序列化的类中,使用@JsonSerialize注解:

  1. @JsonSerialize(using = ParentReferenceSerializer.class)
  2. public Parent getParent() {
  3. return parent;
  4. }
展开查看全部

相关问题