【发布时间】:2016-03-14 14:18:24
【问题描述】:
我正在尝试编写一个自定义反序列化程序,以减少我从其他地方收到的大量数据。我从反序列化器返回一个自定义对象列表。
我的问题是,如果这是我的自定义反序列化器,我该怎么做:
public class MyCustomDeserializer extends JsonDeserializer<List<CustomClass>> { ... }
我当然不能这样做:
final SimpleModule module = new SimpleModule();
module.addDeserializer(List<CustomClass>.class, new MyCustomDeserializer());
这样的事情会起作用吗?
final List<CustomClass> response = Arrays.asList(objectMapper.readValue(stringBean, CustomClass[].class));
如果这确实有效,我觉得它有点令人困惑和“危险”?反序列化不是在 asList 方法调用内部完成的吗?所以它基本上将 List 映射到 array[] ?
我了解了 TypeReference,所以我可以像这样使用它:
objectMapper.readValue(stringBean, new TypeReference<List<CustomClass>>(){});
但我听说它比较慢。
我也不想为列表创建一个容器,并在反序列化中返回它,因为这意味着它将被包装在另一个 json 对象中,我只是希望我的端点产生类似的东西:
[{object1}, {object2}]
// instead of
{"Output" : [{object1}, {object2}]}
编辑:
似乎我误解了杰克逊在这两种情况下如何使用我的解串器:
final List<CustomClass> response = Arrays.asList(objectMapper.readValue(stringBean, CustomClass[].class));
// or
objectMapper.readValue(stringBean, new TypeReference<List<CustomClass>>(){});
看起来反序列化器被调用了两次,对数组中的每个对象调用一次。我认为整个数组将被视为一个整体。为了消除混乱,我的意思是:
我收到并尝试反序列化的 json 看起来像这样:
[
{
"Data" : {
"id" : "someId",
"otherThing" : "someOtherThing"
},
"Message" : "OK"
},
{
"Data" : null,
"Message" : "Object not found for id blabla"
}
]
所以我虽然这是我的反序列化器中的内容,但正如我之前所说,我似乎实际上从该数组中获取了每个“条目”并多次调用它。
【问题讨论】:
-
还需要说明我使用@JsonDeserializer 注释在bean 上注册了反序列化器。
-
使用
ObjectMapper的TypeFactory;它允许您根据需要创建类型描述,即“自定义类列表”。另外,请提及您使用的 Jackson 版本。 -
我使用的是 jackson 2.4 版本。你能提供一些使用类型工厂方法的材料吗?谢谢。
标签: java json jackson deserialization