我在JAX-RS环境中使用杰克逊与Jersey,并且引用了一个外部库,我只对其影响有限。从这个外部库我使用一些dataholder / -model作为返回类型,它有一个与String.isEmpty()
相当的 isEmpty()方法虽然序列化不是问题,但反序列化会导致以下异常,因为数据模型没有 setEmpty()方法,并且Jackson将 isEmpty()方法解释为名为 empty 的字段。
Unrecognized field "empty" (class de.unirostock.sems.cbarchive.meta.omex.VCard), not marked as ignorable (4 known properties: "givenName", "organization", "email", "familyName"])
at [Source: org.glassfish.jersey.message.internal.EntityInputStream@36082d97; line: 1, column: 369]
将 @JsonIgnore 添加到外部库不是一个选项,因为这会导致巨大的开销,我也不希望将数据持有者封装到另一个中,只需委托方法或在JavaScript中过滤字段。
还有其他可能迫使杰克逊忽略这个空“字段”吗?
答案 0 :(得分:3)
您可以使用Jackson's MixIn Annotations。
它允许您覆盖默认的Class配置。
通过这种方式,您可以使用@JsonIgnore
而无需修改您正在使用的外部库。
在你的例子中:
你有这个第三方课de.unirostock.sems.cbarchive.meta.omex.VCard
,你希望杰克逊忽略这个空房。
声明一个MixIn类或接口:
public interface VCardMixIn {
@JsonIgnore
boolean isEmpty();
}
然后在杰克逊的ObjectMapper
配置中:
objectMapper.getDeserializationConfig().addMixInAnnotations(VCard.class, VCardMixIn.class)
答案 1 :(得分:0)
假设您正在使用ObjectMapper
,则可以将其配置为全局忽略未知属性。
ObjectMapper om = new ObjectMapper();
om.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
以下简单测试说明了这一点(使用jackson-mapper-asl-1.9.10)。
public static void main(String[] args) throws Exception {
org.codehaus.jackson.map.ObjectMapper om = new org.codehaus.jackson.map.ObjectMapper();
om.configure(org.codehaus.jackson.map.DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
String json = "{\"one\":\"hola mundo!\", \"empty\":\"unknown\", \"someOtherUnknown\":123}";
IgnoreUnknownTestDto dto = om.readValue(json, IgnoreUnknownTestDto.class);
System.out.println(json+" DESERIALIZED AS "+dto);
}
public static class IgnoreUnknownTestDto {
private String one;
public String getOne() {
return one;
}
public void setOne(String one) {
this.one = one;
}
public boolean isEmpty() {
return one == null || one.isEmpty();
}
@Override
public String toString() {
return "one: '"+this.getOne()+"', empty: '"+this.isEmpty()+"'";
}
}
输出:
{"one":"hola mundo!", "empty":"unknown", "someOtherUnknown":123} DESERIALIZED AS one: 'hola mundo!', empty: 'false'