Jackson:忽略属性,而不是抛出JsonMappingException

我有一个需要使用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" : {} } }

杰克逊遇到以下情况时会抛出此异常:

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如果无法反序列化该属性,是否有任何方法告诉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;

}

}

如果我将注释添加到字段中:

@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并对其进行反序列化,那么它将正常工作。

回答:

我已经弄清楚了为什么自定义反序列化器不起作用:该readValueAs方法使用了{,该触发了异常,留作}下一个标记。这将关闭内部对象,然后解析器将认为接下来遇到的枚举值需要解析为内部类型,而不是枚举类型。

我明天会尝试,但是我认为方法是这样的deserialize:

ObjectMapper om = ...;

JsonNode node = arg0.readValueAs(JsonNode.class);

try

{

return om.readValue(node, new TypeReference<List<C>>(){});

}

catch (JsonMappingException jme)

{

}

return null;

以上是 Jackson:忽略属性,而不是抛出JsonMappingException 的全部内容, 来源链接: utcz.com/qa/423598.html

回到顶部