2012-03-19 11 views
23

estoy usando Gson para generar ouput de depuración en mi solicitudvolcado objeto de cadena con Jackson

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

Pero Gson se queja acerca de un error de referencia circular al intentar serializar una estructura de datos. ¿Se puede hacer esto con la biblioteca de Jackson?

UPD Gson 2.3.1: Lanzamiento 20 Nov, 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) 

Respuesta

31

Para serializar con 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); 
} 
+0

el primer argumento de configure() método debería ser 'SerializationFeature.FAIL_ON_EMPTY_BEANS' actualmente . Su método serialize() debería tener 'throws JsonProcessingException' o try/catch block – kiedysktos

10

Jackson puede hacer frente a ciclos en el gráfico de objetos con:

  1. @JsonIgnore, donde omite el prope rty totalmente
  2. @JsonManagedReference y @JsonBackReference
  3. una costumbre Serializador que se extiende JsonSerializer

Se podría utilizar JsonSerializer cuando todavía desea proporcionar alguna información sobre el objeto, pero desea omitir ciertos campos (los que causan el ciclo) Por ejemplo:

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

Luego, en la clase en la que se publica por entregas, que tendría que utilizar un @JsonSerialize anotación:

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