Jackson - 仅对特定 JSON 使用自定义解串器
Jackson - Use custom deserializer only for specific JSON
我们有一个 class 包含多套多头。我们希望将它们序列化为数组,大多数客户都这样做。
但是,我们有一个 PHP 客户端,它创建的集合以一种奇怪的方式序列化。一个数字为 4 的集合是这样的:
"setOfNumbers": {
"4": 0
},
自然地,Jackson 抱怨这是一个对象而不是数组。我想要的是拥有一个自定义反序列化器,仅当 Jackson 检测到 Set<Long>
应该位于的对象时才会调用(理想情况下,仅当它们包含在特定的 classes 中时。)
我试过这个:
this.addDeserializer(Set.class, new StdDelegatingDeserializer<>(new StdConverter<Map<String, Long>, Set<Long>>() {
@Override
public Set<Long> convert(Map<String, Long> set) {
return parseLongs(set);
}
}));
问题是现在它需要一个对象而不是所有 Set 字段的数组。被反序列化的class是生成的,所以我不能添加任何注释或进行其他更改。
如果生成的 class 始终具有相同的名称,您可以尝试使用 Json Jackson Mix-in 注释,如此 example
所示
我们有一个 class 包含多套多头。我们希望将它们序列化为数组,大多数客户都这样做。
但是,我们有一个 PHP 客户端,它创建的集合以一种奇怪的方式序列化。一个数字为 4 的集合是这样的:
"setOfNumbers": {
"4": 0
},
自然地,Jackson 抱怨这是一个对象而不是数组。我想要的是拥有一个自定义反序列化器,仅当 Jackson 检测到 Set<Long>
应该位于的对象时才会调用(理想情况下,仅当它们包含在特定的 classes 中时。)
我试过这个:
this.addDeserializer(Set.class, new StdDelegatingDeserializer<>(new StdConverter<Map<String, Long>, Set<Long>>() {
@Override
public Set<Long> convert(Map<String, Long> set) {
return parseLongs(set);
}
}));
问题是现在它需要一个对象而不是所有 Set 字段的数组。被反序列化的class是生成的,所以我不能添加任何注释或进行其他更改。
如果生成的 class 始终具有相同的名称,您可以尝试使用 Json Jackson Mix-in 注释,如此 example
所示