【发布时间】:2015-04-09 17:04:44
【问题描述】:
我整天都在寻找可以回答这个问题的东西,但到目前为止我运气不佳。
我的问题很简单:如何使用 Jackson 正确反序列化匿名对象。
private interface Interface1
{
int getValue();
}
public static void testAnonymousObject() throws IOException
{
ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
mapper.setVisibility(PropertyAccessor.ALL, Visibility.NONE);
mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
Interface1 testObject = new Interface1()
{
private final int value = 5;
@Override
public int getValue()
{
return value;
}
};
String json = mapper.writeValueAsString(testObject);
System.out.println("JSON = " + json);
Interface1 received = (Interface1) mapper.readValue(json, Object.class);
System.out.println(received);
}
在我得到异常之前的输出是:JSON = ["com.foo.test.JacksonTest$1",{"value":5}]:
线程“main”com.fasterxml.jackson.databind.JsonMappingException 中的异常:无法将 com.foo.test.JacksonTest$1 类(本地/匿名类型)反序列化为 Bean。
编辑 澄清一下,Jackson 和 XStream 都能够序列化对象。但似乎只有 XStream 能够反序列化对象。所以这个场景可以工作。
【问题讨论】:
-
一个内部类实例需要一个外部类的实例来构造。杰克逊会用什么?它将如何创建外部类实例?顶级类和静态嵌套类有什么问题?
-
这里被序列化/反序列化的对象只是一个空接口的匿名实现。问题是我正在将已经使用 XStream 序列化的大型代码库转换为使用 Jackson。匿名对象在代码中相当常见。在这种情况下,XStream 能够序列化和反序列化这个对象。 Jackson 只能序列化,不能反序列化。
标签: java json serialization jackson deserialization