D.R*_*van 4 java json jackson deserialization
我正在尝试编写一个自定义反序列化器,以便减少从其他地方收到的大量数据.我从反序列化器返回一个自定义对象列表.
我的问题是,如果这是我的自定义反序列化器,我该怎么做:
public class MyCustomDeserializer extends JsonDeserializer<List<CustomClass>> { ... }
Run Code Online (Sandbox Code Playgroud)
我当然不能这样做:
final SimpleModule module = new SimpleModule();
module.addDeserializer(List<CustomClass>.class, new MyCustomDeserializer());
Run Code Online (Sandbox Code Playgroud)
这样的事情会起作用吗?
final List<CustomClass> response = Arrays.asList(objectMapper.readValue(stringBean, CustomClass[].class));
Run Code Online (Sandbox Code Playgroud)
如果这确实有效,我发现它有点令人困惑和"危险"?是不是在asList方法调用中完成了反序列化?所以它基本上将List映射到数组[]?
我了解了TypeReference,所以我可以这样使用它:
objectMapper.readValue(stringBean, new TypeReference<List<CustomClass>>(){});
Run Code Online (Sandbox Code Playgroud)
但我听说它慢了
我也不想为列表创建一个容器,并在反序列化中返回它,因为这意味着它将被包装在另一个json对象中,我只想让我的端点产生如下内容:
[{object1}, {object2}]
// instead of
{"Output" : [{object1}, {object2}]}
Run Code Online (Sandbox Code Playgroud)
编辑:
似乎我误解了杰克逊在两种情况下如何使用我的解串器:
final List<CustomClass> response = Arrays.asList(objectMapper.readValue(stringBean, CustomClass[].class));
// or
objectMapper.readValue(stringBean, new TypeReference<List<CustomClass>>(){});
Run Code Online (Sandbox Code Playgroud)
看起来反序列化器被调用两次,对于数组中的每个对象一次.我认为整个阵列将被视为一个整体.为了清除这种混淆,这就是我的意思:
我收到并尝试反序列化的json看起来像这样:
[
{
"Data" : {
"id" : "someId",
"otherThing" : "someOtherThing"
},
"Message" : "OK"
},
{
"Data" : null,
"Message" : "Object not found for id blabla"
}
]
Run Code Online (Sandbox Code Playgroud)
所以我虽然这是我在反序列化器中的内容,但正如我之前所说的那样,我实际上从该数组中得到每个"条目"并多次调用它.
Sha*_*her 11
首先,如果您在bean上使用注释注册了自定义反序列化器,CustomClass那么反序列化器应该处理一个实例CustomClass而不是一个集合,因此应该定义:
public class MyCustomDeserializer extends JsonDeserializer<CustomClass> {
@Override
public CustomClass deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
现在您可以使用Jackson的类型工厂向映射器传递所需的类型信息
JavaType customClassCollection = objectMapper.getTypeFactory().constructCollectionType(List.class, CustomClass.class);
List<CustomClass> beanList = (List<CustomClass>)objectMapper.readValue(stringBean, customClassCollection);
Run Code Online (Sandbox Code Playgroud)
Viv*_*thi 11
我通过向模型类中的属性添加自定义反序列化器并使用 JsonDeserialize 注释的contentUsing()方法来解决这个问题,如下所示:
@JsonDeserialize(contentUsing = MyCustomDeserializer.class)
private List<CustomClass> customClassObjList;
Run Code Online (Sandbox Code Playgroud)
其中 MyCustomDeserializer 类是自定义 Jackson JSON 反序列化器,定义为:
public class MyCustomDeserializer extends JsonDeserializer<CustomClass> {
@Override
public CustomClass deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
...
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11785 次 |
| 最近记录: |