2012-03-19 11 views
23

Używam Gson wygenerować debugowania Ouput w mojej aplikacjiwysypisko obiekt String z Jackson

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

Ale Gson nie narzekają okrągłym błędu podczas próby odniesienia do serializacji strukturę danych. Czy można to zrobić z biblioteką Jacksona?

UPD Gson 2.3.1: Wydany lis 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) 

Odpowiedz

31

do serializacji z 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

pierwszy argument configure() metoda powinna być 'SerializationFeature.FAIL_ON_EMPTY_BEANS' obecnie . Twoja metoda serialize() powinna mieć 'throws JsonProcessingException' lub try/catch block – kiedysktos

10

Jackson radzi sobie z cykli w grafie obiektu z:

  1. @JsonIgnore, w którym pominięto prope rty całkowicie
  2. @JsonManagedReference i @JsonBackReference
  3. zwyczaj serializer która rozciąga JsonSerializer

użyłbyś JsonSerializer jeśli nadal chcemy zapewnić pewne informacje na temat obiektu, ale chcę pominąć pewne pola (te powodują cykl). Na przykład:

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

Następnie w klasie, w której jest w odcinkach, to by użyć @JsonSerialize adnotacji:

@JsonSerialize(using = ParentReferenceSerializer.class) 
public Parent getParent() { 
    return parent; 
} 
Powiązane problemy