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)
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);
}
Jackson peut gérer les cycles dans le graphe d'objets avec:
@JsonIgnore
, où vous omettez complètement la propriété@JsonManagedReference
et @JsonBackReference
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;
}