我有一个类需要使用Jackson从
JSON反序列化.类结构如下所示:
public class A {
public B b;
}
public class B {
public List c;
}
public class C {
public String s;
public Long l1;
public Long l2;
public Long l3;
}
反序列化对象大多数工作正常;除了它,它与错误代码互操作,当列表为空时发出错误的值.也就是说,而不是发出:
{ "b" : { "c" : [] } }
它发出:
{ "b" : { "c" : {} } }
遇到这个时,杰克逊抛出了这个异常:
org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token
at [Source: [B@1ad5cabc; line: 1, column: 896] (through reference chain: A["b"]->B["c"])
当然,这一切都是有道理的.输入错误.
但是,在这种情况下,空列表与任何代码无关;如果它是null我不在乎.有没有办法告诉杰克逊忽略这个属性(并存储null)如果无法反序列化它?
我尝试过使用自定义反序列化器:
public class CListDeserializer extends JsonDeserializer>
{
public CListDeserializer() { }
@Override
public List deserialize(JsonParser arg0,
DeserializationContext arg1) throws IOException,
JsonProcessingException
{
try
{
return arg0.readValueAs(new TypeReference>(){});
}
catch (JsonMappingException jme)
{
}
return null;
}
}
如果我将注释添加到字段:
@JsonDeserialize(using=CListDeserializer.class)
public List c;
我得到了这个例外:
org.codehaus.jackson.map.JsonMappingException: Can not instantiate value of type [simple type, class asgard.ChangeEntry] from JSON String; no single-String constructor/factory method (through reference chain: A["b"])
请注意,只有当我尝试反序列化外部类型A时才会发生此异常 – 如果我拉出B的内部序列化值,并反序列化它,它可以正常工作.