使用 Jackson 对 List 进行自定义反序列化

2024-04-26

我正在尝试编写一个自定义反序列化器,以便减少从其他地方收到的大量数据。我从反序列化器返回自定义对象列表。

我的问题是,如果这是我的自定义反序列化器,我该怎么做:

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}]}

EDIT:

看来我误解了杰克逊在这两种情况下如何使用我的解串器:

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"
  }
]

所以我虽然这就是我的解串器中的内容,但正如我之前所说,似乎我实际上从该数组中获取了每个“条目”并多次调用它。


首先,如果您使用 bean 上的注释注册了自定义反序列化器CustomClass那么解串器应该处理一个实例CustomClass而不是一个集合,因此应该定义:

public class MyCustomDeserializer extends JsonDeserializer<CustomClass> {
        @Override
        public CustomClass deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException
        {
            ...
        }
}

现在您可以使用 Jackson 的类型工厂向映射器传递所需的类型信息

JavaType customClassCollection = objectMapper.getTypeFactory().constructCollectionType(List.class, CustomClass.class);
List<CustomClass> beanList = (List<CustomClass>)objectMapper.readValue(stringBean, customClassCollection);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Jackson 对 List 进行自定义反序列化 的相关文章

随机推荐