我尝试使用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();
}
答案 0 :(得分:2)
for i in array: f(x)
说您忽略了未知属性。因此,如果您将@JsonIgnoreProperties(ignoreUnknown = true)
数据解组为B
个实例,则A
属性会被忽略,而不会被填充,因此这就是您获得c
的原因。
删除此注释,您应该开始获取null
或类似内容。
JsonMappingException
仅用于序列化。
答案 1 :(得分:1)
objectMapper返回一个对象,其所有字段都初始化为null。怎么样 我是否避免这种行为?
输入对象中与目标类匹配的字段不会设置为null。 因此,请确保存在一些匹配的字段(具有相同名称的字段)。
如果您不想要null,则可能具有这些字段的默认值。 这可以完成
String s="default value"
; 如果您的源json完全不同,而不是单个匹配字段,那么您将获得每个字段为空的对象。