【发布时间】:2012-01-12 15:01:29
【问题描述】:
我有一个类需要使用 Jackson 从 JSON 反序列化。类结构如下所示:
public class A {
public B b;
}
public class B {
public List<C> c;
}
public class C {
public String s;
public Long l1;
public Long l2;
public Long l3;
}
反序列化对象大部分都可以正常工作; 除了,它与在列表为空时发出错误值的错误代码互操作。也就是说,而不是发射:
{ "b" : { "c" : [] } }
它发出了:
{ "b" : { "c" : {} } }
Jackson 在遇到这个时抛出这个异常:
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 我不在乎。如果无法反序列化,有什么方法可以告诉 Jackson 忽略此属性(并存储 null)?
我尝试过使用自定义反序列化器:
public class CListDeserializer extends JsonDeserializer<List<C>>
{
public CListDeserializer() { }
@Override
public List<C> deserialize(JsonParser arg0,
DeserializationContext arg1) throws IOException,
JsonProcessingException
{
try
{
return arg0.readValueAs(new TypeReference<List<C>>(){});
}
catch (JsonMappingException jme)
{
}
return null;
}
}
如果我在字段中添加注释:
@JsonDeserialize(using=CListDeserializer.class)
public List<C> 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 的内部序列化值并反序列化它,它工作正常。
【问题讨论】:
-
还有一个数据点:B 类还有一个枚举字段,它与
A中的B引用同名:public EnumType b。当 Jackson 去反序列化内部类型B时,它似乎感到困惑并试图将其反序列化为A