6

jacksonオブジェクトマッパーを使用して、バイト配列をJava型に逆シリアル化しようとしています。

    @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 を構成したことです。

@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();
    }
4

2 に答える 2

2

@JsonIgnoreProperties(ignoreUnknown = true)不明なプロパティを無視すると言っています。したがって、BデータをAインスタンスとしてアンマーシャリングすると、cプロパティは無視され、埋められないため、null.

この注釈を削除して、取得JsonMappingExceptionまたは類似のものを開始する必要があります。

@JsonInclude(JsonInclude.Include.NON_NULL)シリアライズ専用です。

于 2016-11-08T22:38:56.890 に答える
1

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

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

null が必要ない場合は、それらのフィールドにデフォルト値を設定できます。これはできるかもしれません

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

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

于 2016-11-08T22:41:58.420 に答える