750 Stimmen

Ignorieren neuer Felder in JSON-Objekten mit Jackson

Ich verwende die Jackson JSON-Bibliothek, um einige JSON-Objekte in POJO-Klassen in einer Android-Anwendung zu konvertieren. Das Problem ist, dass sich die JSON-Objekte ändern und neue Felder hinzugefügt werden können, während die Anwendung veröffentlicht wird, aber derzeit bricht es sogar, wenn ein einfaches String-Feld hinzugefügt wird, das sicher ignoriert werden kann.

Gibt es eine Möglichkeit, Jackson anzuweisen, neu hinzugefügte Felder zu ignorieren? (z. B. nicht existierende Felder in POJO-Objekten)? Ein globales Ignorieren wäre toll.

27voto

user5636084 Punkte 261

Bei Verwendung einer Pojo-Klasse auf Basis einer JSON-Antwort. Wenn Chancen gibt es, dass JSON häufig ändert deklarieren auf pojo Klasse Ebene:

@JsonIgnoreProperties(ignoreUnknown = true)

und beim objectMapper dies hinzufügen, wenn Sie konvertieren:

objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

Der Code wird also nicht abbrechen.

20voto

Alboz Punkte 1725

Ab Jackson Version 2.4 und höher gibt es einige Änderungen. Hier ist, wie Sie es jetzt tun:

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

..........................................................................

 ObjectMapper mapper = new ObjectMapper();
    // to prevent exception when encountering unknown property:
 mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

Hinweis: Die auf @Anmerkung basierende Lösung bleibt unverändert. Wenn Sie diese verwenden möchten, lesen Sie die anderen Antworten.

For more information see the 10 minutes Configuration tutorial at: https://github.com/FasterXML/jackson-databind

18voto

Rushi Shah Punkte 1901

Stellen Sie sicher, dass Sie die @JsonIgnoreProperties(ignoreUnknown = true) Annotation an die übergeordnete POJO-Klasse, die Sie als Ergebnis des Parsens der JSON-Antwort befüllen möchten, und nicht an die Klasse, in der die Konvertierung von JSON in Java Object stattfindet.

11voto

mekdev Punkte 468

Wie bereits erwähnt, funktionieren die Anmerkungen nur, wenn dies in der übergeordneten POJO-Klasse angegeben ist und nicht in der Klasse, in der die Umwandlung von JSON in Java Object stattfindet.

Die andere Alternative, ohne die übergeordnete Klasse zu berühren und Störungen zu verursachen, besteht darin, eine eigene Mapperkonfiguration nur für die Mappermethoden zu implementieren, die Sie dafür benötigen.

Auch das Paket der Deserialisierungsfunktion wurde verschoben. DeserializationConfig.FAIL_ON_UNKNOWN_PROPERTIES nach DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES

import org.codehaus.jackson.map.DeserializationConfig;
...
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

10voto

Thoomas Punkte 1904

Für diejenigen, die Spring Boot verwenden, können Sie das Standardverhalten von Jackson konfigurieren, indem Sie die Jackson2ObjectMapperBuilder .

Zum Beispiel:

@Bean
public Jackson2ObjectMapperBuilder configureObjectMapper() {
    Jackson2ObjectMapperBuilder oMapper = new Jackson2ObjectMapperBuilder();
    oMapper.failOnUnknownProperties(false);
    return oMapper;
}

Dann können Sie die automatische Verkabelung der ObjectMapper überall, wo Sie es brauchen (standardmäßig wird dieser Objekt-Mapper auch für die Konvertierung von http-Inhalten verwendet).

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