私はいくつかのJSONオブジェクトをAndroidアプリケーション上のPOJOクラスに変換するためにJackson JSONライブラリを使用しています。問題は、アプリケーションの公開中にJSONオブジェクトが変更されて新しいフィールドが追加されることがありますが、現在は単純なStringフィールドが追加された場合でも無効になるため、無視しても問題ありません。
新しく追加されたフィールドを無視するようにJacksonに指示する方法はありますか? (例えばPOJOオブジェクト上に存在しない)?グローバルな無視は素晴らしいでしょう。
Jacksonはクラスレベルで使用できるアノテーションを提供します( JsonIgnoreProperties )。
以下をクラスの先頭に追加します(個々のメソッドの場合はnot)。
@JsonIgnoreProperties(ignoreUnknown = true)
public class Foo {
...
}
使用しているJacksonのバージョンによっては、現在のバージョンとは異なるインポートを使用する必要があります。
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
以前のバージョンではそれはされています:
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
加えて、既に述べた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);
これは注釈がない場合に使用されるデフォルトであり、便利な代替方法になることがあります。
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 を参照してください。
それは2つの方法で達成できます。
未知のプロパティを無視するようにPOJOにマークを付ける
@JsonIgnoreProperties(ignoreUnknown = true)
以下のように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)
JSONレスポンスに基づくpojoクラスを使用している場合jsonの変更が頻繁にpojoクラスレベルで宣言される可能性がある場合は、
@JsonIgnoreProperties(ignoreUnknown = true)
変換する場合は、objectMapperでこれを追加します。
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
だからそのコードは壊れません。
JSONからJavaオブジェクトへの変換が行われるクラスではなく、JSON応答の解析の結果として移入する親POJOクラスに@JsonIgnoreProperties(ignoreUnknown = true)
アノテーションを必ず配置してください。
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
@JsonIgnoreProperties(ignoreUnknown = true)
は私にとってうまくいった。私はjdk 1.7でTomcat上で動作するJavaアプリケーションを持っています。
上記のように、アノテーションは、これが親の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);
私は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;
}
}
Spring Bootを使用している人は、Jackson2ObjectMapperBuilder
を使用してJacksonのデフォルトの動作を設定できます。
例えば :
@Bean
public Jackson2ObjectMapperBuilder configureObjectMapper() {
Jackson2ObjectMapperBuilder oMapper = new Jackson2ObjectMapperBuilder();
oMapper.failOnUnknownProperties(false);
return oMapper;
}
その後、必要に応じてObjectMapper
を自動配線することができます(デフォルトでは、このオブジェクトマッパーはhttpコンテンツの変換にも使用されます)。