6

我正在尝试使用杰克逊对象映射器将字节数组反序列化为 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,则可以为这些字段设置默认值。可以这样做

  • 在现场声明String s="default value"
  • 默认情况下,无参数构造函数。Jackson 将调用此构造函数,然后为来自 JSON 数据的匹配字段设置值。

如果您的源 json 完全不同,而不是单个匹配字段,那么您将获得每个字段为空的对象。

于 2016-11-08T22:41:58.420 回答