2016-11-08 8 views
3

jacksonオブジェクトマッパーを使用してバイト配列をJava型に逆シリアル化しようとしています。Jackson Object Mapperすべてのフィールドがnullに初期化されたオブジェクトを返すバイト単位の読み取り値

@JsonIgnoreProperties(ignoreUnknown = true) 
    @JsonInclude(JsonInclude.Include.NON_NULL) 
    public class A { 
    String s; 
    String b; 
    } 

    @JsonIgnoreProperties(ignoreUnknown = true) 
    @JsonInclude(JsonInclude.Include.NON_NULL) 
    public class B { 
    String c; 
    String b; 
    } 

     @JsonIgnoreProperties(ignoreUnknown = true) 
     @JsonInclude(JsonInclude.Include.NON_NULL) 
     public class C { 
     List<CustomType> x; 
     } 

とジャクソン法を使用して、

objectMapper.readValue(byte[] data, Class<T> type). 

私はバイト配列が含まれているオブジェクトをどのようなわからないように、私はそれを指定した型のオブジェクトを作成することができない場合に失敗することにしたいです。ただし、objectMapperはすべてのフィールドがNULLに初期化されたオブジェクトを返します。どのように私はこの動作を避けるのですか?

Ex: 
byte[] b; //contains Class B data 
byte[] a; //contains Class A data 
byte[] c// contains Class C data 
A a = objectMapper.readValue(c, A.class) is returning 
{s=null, b = null} 

と私はObjectMapperを設定しているOWこれは、

@Bean 
    public ObjectMapper objectMapper(HandlerInstantiator handlerInstantiator) { 
     Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); 
     builder.handlerInstantiator(handlerInstantiator); 
     builder.failOnEmptyBeans(false); 
     builder.failOnUnknownProperties(false); 
     builder.simpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); 
     builder.timeZone("UTC"); 
     builder.serializationInclusion(JsonInclude.Include.NON_NULL); 

     return builder.build(); 
    } 
+1

[mcve]を入力してください。 –

+1

@SotiriosDelimanolisは応答に感謝します。私は再現するために必要なものすべてを含んでいます。簡単にするために、私はJavaオブジェクトのgetterとsetterを削除しました。 – Bharath

+1

@Bharathいいえ、あなたはしませんでした。 – lexicore

答えて

1

objectMapperは、すべてのフィールドがnullに初期化されたオブジェクトを返します。どのように 私はこの動作を避けるのですか?

ターゲットクラスに一致する入力オブジェクトのフィールドはnullに設定されません。 したがって、一致するフィールド(同じ名前のフィールド)がいくつかあることを確認してください。

nullを必要としない場合は、これらのフィールドにデフォルト値が設定されている可能性があります。 これは可能です

  • フィールド宣言String s="default value"で;
  • デフォルトでは、パラメータのないコンストラクタです。 Jacksonはこのコンストラクタを呼び出し、JSONデータから一致するフィールドの値を設定します。

ソースjsonが完全に異なっていて、単一の一致するフィールドではない場合は、すべてのフィールドがnullのオブジェクトを取得します。

+1

thats wat私は尋ねています。すべてのnull値を持つオブジェクトを返すこの動作を回避するにはどうすればよいですか。 – Bharath

+0

@Bharath、あなたの質問に答えて私の答えを広げました。 –

2

@JsonIgnoreProperties(ignoreUnknown = true)あなたは、未知の性質を無視言います。したがって、Bのデータを非インスタンス化してAインスタンスとした場合、cプロパティは無視され、入力されないため、nullが得られます。

この注釈を削除すると、JsonMappingExceptionなどが表示されます。

@JsonInclude(JsonInclude.Include.NON_NULL)は、シリアル化用です。

+1

フィールドを解決できない場合は、nullに初期化された値を持つオブジェクトを返します。ただし、フィールドの一部のみが解決された場合、例外がスローされます。シナリオ1はどのように扱いますか? – Bharath

関連する問題