web-dev-qa-db-ja.com

Jacksonを使用してJSONオブジェクトの新しいフィールドを無視する

私はいくつかのJSONオブジェクトをAndroidアプリケーション上のPOJOクラスに変換するためにJackson JSONライブラリを使用しています。問題は、アプリケーションの公開中にJSONオブジェクトが変更されて新しいフィールドが追加されることがありますが、現在は単純なStringフィールドが追加された場合でも無効になるため、無視しても問題ありません。

新しく追加されたフィールドを無視するようにJacksonに指示する方法はありますか? (例えばPOJOオブジェクト上に存在しない)?グローバルな無視は素晴らしいでしょう。

551
Hadi Eskandari

Jacksonはクラスレベルで使用できるアノテーションを提供します( JsonIgnoreProperties )。

以下をクラスの先頭に追加します(個々のメソッドの場合はnot)。

@JsonIgnoreProperties(ignoreUnknown = true)
public class Foo {
    ...
}

使用しているJacksonのバージョンによっては、現在のバージョンとは異なるインポートを使用する必要があります。

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

以前のバージョンではそれはされています:

import org.codehaus.jackson.annotate.JsonIgnoreProperties;
793
Hadi Eskandari

加えて、既に述べた2つの2つのメカニズムには、未知の(マッピングされていない)プロパティによって引き起こされるすべての失敗を抑制するために使用できるグローバルな機能もあります。

// jackson 1.9 and before
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// or jackson 2.0
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

これは注釈がない場合に使用されるデフォルトであり、便利な代替方法になることがあります。

414
StaxMan

Jackson 2の最新かつ完全な回答


注釈を使う

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public class MyMappingClass {

}

Jacksonのオンラインドキュメントの JsonIgnoreProperties を参照してください。

設定を使用する

アノテーションよりも邪魔になりません。

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

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

ObjectReader objectReader = objectMapper.reader(MyMappingClass.class);
MyMappingClass myMappingClass = objectReader.readValue(json);

Jacksonのオンラインドキュメントの FAIL_ON_UNKNOWN_PROPERTIES を参照してください。

108
Yves M.

それは2つの方法で達成できます。

  1. 未知のプロパティを無視するようにPOJOにマークを付ける

    @JsonIgnoreProperties(ignoreUnknown = true)
    
  2. 以下のようにPOJO/jsonをシリアライズ/デシリアライズするObjectMapperを構成します。

    ObjectMapper mapper =new ObjectMapper();            
    // for Jackson version 1.X        
    mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    // for Jackson version 2.X
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) 
    
70
Amit Kaneria

JSONレスポンスに基づくpojoクラスを使用している場合jsonの変更が頻繁にpojoクラスレベルで宣言される可能性がある場合は、

@JsonIgnoreProperties(ignoreUnknown = true)

変換する場合は、objectMapperでこれを追加します。

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

だからそのコードは壊れません。

26
user5636084

JSONからJavaオブジェクトへの変換が行われるクラスではなく、JSON応答の解析の結果として移入する親POJOクラスに@JsonIgnoreProperties(ignoreUnknown = true)アノテーションを必ず配置してください。

17
Rushi Shah

Jacksonバージョン2.4以降から、いくつかの変更がありました。これがあなたのやり方です。

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

注:@アノテーションベースの解決策は同じままなので、それを使用したい場合は他の答えを参照してください。

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

17
Alboz

@JsonIgnoreProperties(ignoreUnknown = true)は私にとってうまくいった。私はjdk 1.7でTomcat上で動作するJavaアプリケーションを持っています。

16
Parul

上記のように、アノテーションは、これが親のPOJOクラスで指定されていてJSONからJavaオブジェクトへの変換が行われているクラスでは指定されていない場合にのみ機能します。

親クラスに触れずに混乱を引き起こさないもう1つの方法は、これに必要なマッパーメソッドに対してのみ独自のマッパー設定を実装することです。

逆シリアル化機能のパッケージも移動されました。 DeserializationConfig.FAIL_ON_UNKNOWN_PROPERTIESからDeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIESへ

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

私はjackson-xxx 2.8.5を使用しています。

<dependencies>
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.8.5</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.8.5</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.8.5</version>
    </dependency>

</dependencies>

まず、未知のプロパティをグローバルに無視したい場合は、ObjectMapperを設定できます。
以下のように:

ObjectMapper objectMapper = new ObjectMapper();

objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

クラスを無視したい場合は、次のようにクラスにアノテーション@JsonIgnoreProperties(ignoreUnknown = true)を追加できます。

@JsonIgnoreProperties(ignoreUnknown = true)
public class E1 {

    private String t1;

    public String getT1() {
        return t1;
    }

    public void setT1(String t1) {
        this.t1 = t1;
    }
}
7
inOut

Spring Bootを使用している人は、Jackson2ObjectMapperBuilderを使用してJacksonのデフォルトの動作を設定できます。

例えば ​​:

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

その後、必要に応じてObjectMapperを自動配線することができます(デフォルトでは、このオブジェクトマッパーはhttpコンテンツの変換にも使用されます)。

5
Thoomas