Java Jackson:忽略属性而不是抛出JsonMappingException
我有一个类需要使用Jackson从JSON反序列化。类结构如下所示:Java Jackson:忽略属性而不是抛出JsonMappingException,java,json,jackson,Java,Json,Jackson,我有一个类需要使用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" : {} } } J
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" : {} } }
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;
}
}
请注意,只有当我尝试反序列化外部类型
A
时,才会发生此异常——如果我取出B
的内部序列化值并进行反序列化,则可以正常工作。我已经找出自定义反序列化器不工作的原因:readValueAs
方法使用{
,这会触发异常,留下}
作为下一个标记。这会关闭内部对象,然后解析器会认为接下来遇到的枚举值需要作为内部类型而不是枚举类型进行解析
明天我将尝试此方法,但我认为应该这样做,在反序列化方法中:
ObjectMapper om = ...;
JsonNode node = arg0.readValueAs(JsonNode.class);
try
{
return om.readValue(node, new TypeReference<List<C>>(){});
}
catch (JsonMappingException jme)
{
}
return null;
ObjectMapper om=。。。;
JsonNode节点=arg0.readValueAs(JsonNode.class);
尝试
{
返回om.readValue(节点,newTypeReference(){});
}
捕获(JsonMappingException jme)
{
}
返回null;
另一个数据点:类B还有一个枚举字段,该字段与A
中对B
的引用同名:公共枚举类型B
。当Jackson去反序列化内部类型B
时,它似乎感到困惑,并试图将其反序列化为A
看起来不错。如果arg0.readValue由于(JsonNode.class)
不起作用,您可以尝试使用arg0.readValueAsTree()
,这也会返回一个JsonNode。
@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"])
ObjectMapper om = ...;
JsonNode node = arg0.readValueAs(JsonNode.class);
try
{
return om.readValue(node, new TypeReference<List<C>>(){});
}
catch (JsonMappingException jme)
{
}
return null;