我有一个需要使用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;
}
Run Code Online (Sandbox Code Playgroud)
反序列化对象通常效果很好;除了,它与错误代码互操作,当列表为空时,错误代码发出错误的值。也就是说,与其发出:
{ "b" : { "c" : [] } }
Run Code Online (Sandbox Code Playgroud)
它发出:
{ "b" : { "c" : {} } }
Run Code Online (Sandbox Code Playgroud)
杰克逊遇到以下情况时会抛出此异常:
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"])
Run Code Online (Sandbox Code Playgroud)
当然,所有这些都是有道理的。输入错误。
但是,这种情况下的空列表与任何代码都不相关;如果是的话,null我不在乎。null如果无法反序列化该属性,是否有任何方法可以告诉Jackson忽略此属性(并存储)?
我尝试使用自定义反序列化器:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我将注释添加到字段中:
@JsonDeserialize(using=CListDeserializer.class)
public List<C> c;
Run Code Online (Sandbox Code Playgroud)
我得到这个异常:
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"])
Run Code Online (Sandbox Code Playgroud)
请注意,仅当我尝试对外部类型进行反序列化时,才会发生此异常A-如果我为拔出内部序列化的值B并对其进行反序列化,则它可以正常工作。
我已经弄清楚为什么自定义反序列化器不起作用:该readValueAs方法消耗{,这会触发异常,并}作为下一个令牌留下。这会关闭内部对象,然后解析器会认为接下来遇到的枚举值需要解析为内部类型,而不是枚举类型。
我明天会尝试这个,但我认为要走的路是这样的,在deserialize方法中:
ObjectMapper om = ...;
JsonNode node = arg0.readValueAs(JsonNode.class);
try
{
return om.readValue(node, new TypeReference<List<C>>(){});
}
catch (JsonMappingException jme)
{
}
return null;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4243 次 |
| 最近记录: |