12 Stimmen

Jackson JSON wickelt Attribute von verschachtelten Objekten nicht ein

Ich habe folgende Kurse belegt:

public class Container {
    private String name;
    private Data data;
}

public class Data {
    private Long id;
}

Wenn ich serialisiere Container Klasse mit Jackson erhalte ich

{"name":"Some name","data":{"id":1}}

Aber das Ergebnis muss stimmen:

{"name":"Some name","id":1}

Ist es möglich (ohne Hinzufügen von Container.getDataId() Methode)? Wenn ja, wie kann man das tun?


Update

Ich habe versucht, eine benutzerdefinierte JsonSerializer<Data> aber das Ergebnis war dasselbe wie zuvor

public class JsonDataSerializer extends JsonSerializer<Data> {

    private static Logger logger = Logger.getLogger(JsonDataSerializer.class);

    @Override
    public void serialize(Data value, JsonGenerator jgen, 
            SerializerProvider provider)
            throws IOException,JsonProcessingException {

        Long id = (value.getId() == null) ? 0l : value.getId();
        jgen.writeStartObject();
        jgen.writeNumberField("id", id);
        jgen.writeEndObject();
        logger.debug("Data id " + id + " serialized to JSON.");       
    }
}

Ich habe auch versucht, Folgendes hinzuzufügen @JsonSerialize obiger Vermerk Data Klasse, dann über getter in Container Klasse. Wie ich bereits erwähnt habe, ohne jeden Erfolg. Mein Serializer wird verwendet, Logger protokolliert Nachricht.


Update 2

Wenn ich die writeStartObject() y writeEndObject() dann wird kein JSON zurückgegeben, sondern nur HTTP Status 500 Fehler und keine Ausnahme wird ausgelöst, außer dem, was ich in der Debug-Ausgabe gefunden habe.

DEBUG: org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver - Resolving exception from handler [com.example.DataController@16be8a0]: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Can not write a field name, expecting a value; nested exception is org.codehaus.jackson.JsonGenerationException: Can not write a field name, expecting a value
DEBUG: org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver - Resolving exception from handler [com.example.DataController@16be8a0]: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Can not write a field name, expecting a value; nested exception is org.codehaus.jackson.JsonGenerationException: Can not write a field name, expecting a value
DEBUG: org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver - Resolving exception from handler [com.example.DataController@16be8a0]: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Can not write a field name, expecting a value; nested exception is org.codehaus.jackson.JsonGenerationException: Can not write a field name, expecting a value

12voto

Amol Brid Punkte 946

Jackson 1.9 hat Folgendes eingeführt JsonUnwrapped die genau das tut, wonach Sie suchen.

0voto

henrik_lundgren Punkte 5324

Ich denke, Sie müssen einen benutzerdefinierten Serialisierer für den Datentyp erstellen und registrieren.

Sie können die Annotation @JsonSerialize für die Klasse Data verwenden.

Geben Sie eine Serializer-Klasse an:

@JsonSerialize(using = MyDataSerializer.class)
public class Data {
    ...
}

public static class MyDataSerializer extends JsonSerializer<Data> {

    @Override
    public void serialize(Data value, JsonGenerator jgen,
            SerializerProvider provider) throws IOException,JsonProcessingException {
        jgen.writeNumberField("id", value.id);
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X