web-dev-qa-db-fra.com

vider l'objet dans String avec Jackson

J'utilise Gson pour générer une sortie de débogage dans mon application

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

Mais Gson se plaint d'une erreur de référence circulaire lors de la tentative de sérialisation d'une structure de données. Cela peut-il être fait avec la bibliothèque Jackson?

UPD Gson 2.3.1: publié le 20 novembre 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)
28
turbanoff

Pour sérialiser avec 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);
}
34
Bruno Grieder

Jackson peut gérer les cycles dans le graphe d'objets avec:

  1. @JsonIgnore , où vous omettez complètement la propriété
  2. @JsonManagedReference et @JsonBackReference
  3. un sérialiseur personnalisé qui étend JsonSerializer

Vous utiliseriez JsonSerializer lorsque vous souhaitez toujours fournir des informations sur l'objet mais que vous souhaitez omettre certains champs (ceux qui provoquent le cycle). Par exemple:

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

Ensuite, dans la classe dans laquelle est sérialisé, vous utiliseriez un @JsonSerialize annotation:

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