Java 如何在jackson反序列化期间忽略json数组上的类型信息?
我想将ObjectMapper配置从包含类型信息的配置迁移到不包含类型信息的配置 目前,my ObjectMapper的配置如下:Java 如何在jackson反序列化期间忽略json数组上的类型信息?,java,arrays,json,jackson,Java,Arrays,Json,Jackson,我想将ObjectMapper配置从包含类型信息的配置迁移到不包含类型信息的配置 目前,my ObjectMapper的配置如下: ObjectMapper objectMapper = new ObjectMapper().enableDefaultTypingAsProperty( ObjectMapper.DefaultTyping.NON_FINAL, "@class" ); 这使我能够反序列化如下所示的json对象: { "@class": "com.foo.BarCl
ObjectMapper objectMapper = new ObjectMapper().enableDefaultTypingAsProperty(
ObjectMapper.DefaultTyping.NON_FINAL,
"@class"
);
这使我能够反序列化如下所示的json对象:
{
"@class": "com.foo.BarClass",
"barProp": "bar"
"barList": [
[
"java.util.ArrayList",
[
{ "@class": "com.foo.BarListElement", ... },
{ "@class": "com.foo.BarListElement", ... },
...
]
],
...
}
使用以下POJO:
public class BarClass {
private String barProp;
// assume BarListElement to be a POJO with sensible getters/setters
List<BarListElement> barList;
// assume some other trivial fields and corresponding getters/setters
}
公共类BarClass{
私有字符串barProp;
//假设BarListElement是一个具有合理的getter/setter的POJO
列表栏列表;
//假设其他一些普通字段和相应的getter/setter
}
但是,我想删除对enableDefaultTypingAsProperty
的调用,因为我的应用程序代码在反序列化过程中已经知道该类,因此它不必要地将反序列化代码绑定到完全限定的类名
我试图通过删除对ObjectMapper上的enableDefaultTypingAsProperty
的调用并调用配置(UNKNOWN属性上的反序列化feature.FAIL,false)
来实现这一点,目的是忽略json上存在的“@class”
属性。不幸的是,这只适用于不包含数组的json,因为我收到的json数组包含具体的列表类型信息(即示例中数组中的“java.util.ArrayList”
元素)
我想问一下,是否有任何方法可以配置
ObjectMapper
,从而忽略json数组上的集合类型。您需要自定义集合反序列化程序,它将关注额外的类型信息。类型为的数组具有常规结构:[“java.util.collectionType”,[…]
。要做到这一点,我们需要使用和定制。让我们从自定义反序列化程序开始:
class OmitListTypeJsonDeserializer extends CollectionDeserializer {
public OmitListTypeJsonDeserializer(CollectionDeserializer src) {
super(src);
}
@Override
public Collection<Object> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
p.nextToken(); // Omit array type
p.nextToken(); // Omit comma and start array
Collection<Object> collection = super.deserialize(p, ctxt);
p.nextToken(); // Omit end of array
return collection;
}
@Override
public CollectionDeserializer createContextual(DeserializationContext ctxt, BeanProperty property) throws JsonMappingException {
return new OmitListTypeJsonDeserializer(super.createContextual(ctxt, property));
}
}
和反序列化对象:
BarClass{barProp='PROP1', barList=[BarListElement{sid=0.09525693290513237}, BarListElement{sid=0.689909415561781}], zet=123}
你能展示一下你的
POJO
模型和示例JSON
,反序列化不起作用吗?@MichałZiober用POJO编辑了我的问题。示例json已经在讨论中了
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.DeserializationConfig;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier;
import com.fasterxml.jackson.databind.deser.std.CollectionDeserializer;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.type.CollectionType;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
public class JsonApp {
public static void main(String[] args) throws Exception {
ObjectMapper typeAwareMapper = new ObjectMapper();
typeAwareMapper.enable(SerializationFeature.INDENT_OUTPUT);
typeAwareMapper.enableDefaultTypingAsProperty(ObjectMapper.DefaultTyping.NON_FINAL, "@class");
String json = typeAwareMapper.writeValueAsString(new BarClass());
System.out.println(json);
SimpleModule module = new SimpleModule();
module.setDeserializerModifier(new OmitListTypeDeserializerModifier());
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(module);
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
System.out.println(mapper.readValue(json, BarClass.class));
}
}
class BarClass {
private String barProp = "PROP1";
private List<BarListElement> barList = Arrays.asList(new BarListElement(), new BarListElement());
private Integer zet = 123;
// getters, setters
}
class BarListElement {
private Double sid = Math.random();
// getters, setters
}
{
"@class" : "com.celoxity.BarClass",
"barProp" : "PROP1",
"barList" : [ "java.util.Arrays$ArrayList", [ {
"@class" : "com.celoxity.BarListElement",
"sid" : 0.09525693290513237
}, {
"@class" : "com.celoxity.BarListElement",
"sid" : 0.689909415561781
} ] ],
"zet" : 123
}
BarClass{barProp='PROP1', barList=[BarListElement{sid=0.09525693290513237}, BarListElement{sid=0.689909415561781}], zet=123}