1019 Stimmen

Jackson mit JSON: Unerkanntes Feld, nicht als ignorierbar markiert

Ich muss eine bestimmte JSON-Zeichenfolge in ein Java-Objekt konvertieren. Ich verwende Jackson für die JSON-Verarbeitung. Ich habe keine Kontrolle über die JSON-Eingabe (ich lese von einem Webdienst). Dies ist meine Eingabe JSON:

{"wrapper":[{"id":"13","name":"Fred"}]}

Hier ist ein vereinfachter Anwendungsfall:

private void tryReading() {
    String jsonStr = "{\"wrapper\"\:[{\"id\":\"13\",\"name\":\"Fred\"}]}";
    ObjectMapper mapper = new ObjectMapper();  
    Wrapper wrapper = null;
    try {
        wrapper = mapper.readValue(jsonStr , Wrapper.class);
    } catch (Exception e) {
        e.printStackTrace();
    }
    System.out.println("wrapper = " + wrapper);
}

Meine Entitätsklasse ist:

public Class Student { 
    private String name;
    private String id;
    //getters & setters for name & id here
}

Meine Wrapper-Klasse ist im Grunde ein Container-Objekt, um meine Liste der Schüler zu erhalten:

public Class Wrapper {
    private List<Student> students;
    //getters & setters here
}

Ich erhalte immer wieder diesen Fehler und "wrapper" gibt zurück null . Ich bin mir nicht sicher, was fehlt. Kann mir bitte jemand helfen?

org.codehaus.jackson.map.exc.UnrecognizedPropertyException: 
    Unrecognized field "wrapper" (Class Wrapper), not marked as ignorable
 at [Source: java.io.StringReader@1198891; line: 1, column: 13] 
    (through reference chain: Wrapper["wrapper"])
 at org.codehaus.jackson.map.exc.UnrecognizedPropertyException
    .from(UnrecognizedPropertyException.java:53)

7voto

krmanish007 Punkte 6070

Eine andere Möglichkeit ist diese Eigenschaft in der Datei application.properties spring.jackson.deserialization.fail-on-unknown-properties=false die keine weiteren Code-Änderungen in Ihrer Anwendung erfordert. Und wenn Sie glauben, dass der Vertrag stabil ist, können Sie diese Eigenschaft entfernen oder als wahr markieren.

6voto

sagar Punkte 1149

Entweder ändern

public Class Wrapper {
    private List<Student> students;
    //getters & setters here
}

zu

public Class Wrapper {
    private List<Student> wrapper;
    //getters & setters here
}

---- oder ----

Ändern Sie Ihre JSON-Zeichenfolge in

{"students":[{"id":"13","name":"Fred"}]}

6voto

Rohitesh Punkte 969

Was bei mir funktioniert hat, war, die Immobilie öffentlich zu machen.

5voto

Niamath Punkte 199

Das hat bei mir perfekt funktioniert

objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

5voto

Wenn Sie aus irgendeinem Grund die @JsonIgnoreProperties-Annotationen nicht zu Ihrer Klasse hinzufügen können und Sie sich in einem Webserver/Container wie Jetty befinden. Sie können den ObjectMapper innerhalb eines benutzerdefinierten Anbieters erstellen und anpassen

import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;

import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

@Provider
public class CustomObjectMapperProvider implements ContextResolver<ObjectMapper> {

    private ObjectMapper objectMapper;

    @Override
    public ObjectMapper getContext(final Class<?> cls) {
        return getObjectMapper();
    }

    private synchronized ObjectMapper getObjectMapper() {
        if(objectMapper == null) {
            objectMapper = new ObjectMapper();
            objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        }
        return objectMapper;
    }
}

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