сбросить объект в строку с Джексоном - PullRequest
28 голосов
/ 19 марта 2012

Я использую Gson для генерации отладочного вывода в моем приложении

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

Но Гсон действительно жалуется на ошибку циклической ссылки при попытке сериализации структуры данных. Можно ли это сделать с помощью библиотеки Джексона?

UPD Gson 2.3.1: выпущен 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)

Ответы [ 2 ]

34 голосов
/ 19 марта 2012

Для сериализации с Джексоном:

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);
}
10 голосов
/ 19 марта 2012

Джексон может иметь дело с циклами в графе объектов с помощью:

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