【发布时间】:2013-12-30 02:35:42
【问题描述】:
我有一个围绕一个复杂类的轻量级包装类,我需要为它编写一个自定义的 Jackson JSON 反序列化器。包装类很简单,只包含一个字符串、一个日期和我的复杂对象作为属性。 Jackson 是否会自动将简单的反序列化器应用于包装器并将我的自定义反序列化器应用于我的复杂对象?自定义反序列化程序自行工作。但是当我尝试序列化包装器时,Jackson 会抛出 Nullpointer 异常。我一定错过了一些概念性的东西。除了我的自定义反序列化器之外,我还必须向我的模块注册另一个序列化器吗?
java.lang.NullPointerException
at org.codehaus.jackson.impl.ReaderBasedParser._skipWSOrEnd(ReaderBasedParser.java:1477)
at org.codehaus.jackson.impl.ReaderBasedParser.nextToken(ReaderBasedParser.java:368)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:690)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580)
at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2732)
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1863)
at com.newoak.noc.curve.model.tests.ModelParamsTest.deserializeGraph(ModelParamsTest.java:100)
at com.newoak.noc.curve.model.tests.ModelParamsTest.testSerializationDeserialization(ModelParamsTest.java:113)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
尝试反序列化
public ModelParamGraph deserializeGraph(String json) throws JsonGenerationException, JsonMappingException, IOException
{
ObjectMapper mapper = new ObjectMapper();
SimpleModule testModule = new SimpleModule("MyModule", new Version(1, 0, 0, null));
testModule.addSerializer(new SpaceJsonSerializer());
testModule.addDeserializer(Space.class, new SpaceJsonDeserializer());
mapper.registerModule(testModule);
ModelParamGraph space = mapper.readValue(json, ModelParamGraph.class);
return space;
}
包装器
public class ModelParamGraph
{
public String source;
public Date date;
@JsonSerialize(using=SpaceJsonSerializer.class)
@JsonDeserialize(using=SpaceJsonDeserializer.class)
public Space<TModelParam> paramSpace;
public ModelParamGraph()
{
}
public ModelParamGraph(String source, Date date)
{
setSource(source);
setDate(date);
setParamSpace(new Space<TModelParam>());
}
//getters and setters
}
【问题讨论】:
-
我建议您精简所涉及的类,并给我们一个可以重现您的问题的代码。
-
Space 类可以很好地反序列化,我什至可以在 jackson 调用它时逐步通过反序列化器,但随后会出现空指针异常。包装器的默认构造函数在反序列化器之前被调用
-
我在网上找不到任何关于如何处理嵌套类的自定义反序列化器的示例。
标签: java json spring serialization jackson