json 使用Jackson对列表进行自定义格式化

sbdsn5lh  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(135)

我试图写一个自定义的解析器,以削减我从其他地方收到的一大组数据。我从解析器返回一个自定义对象的列表。
我的问题是,我如何做到这一点,如果这是我的自定义编译器:

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方法调用中完成了非线性化吗?所以它基本上是将ListMap到数组[]?
我学习了TypeReference,所以我可以这样使用它:

objectMapper.readValue(stringBean, new TypeReference<List<CustomClass>>(){});


但我听说比较慢。
我也不想为列表创建一个容器,并在容器化中返回它,因为这意味着它将被 Package 在另一个json对象中,我只想让我的端点产生这样的东西:

[{object1}, {object2}]

// instead of

{"Output" : [{object1}, {object2}]}

编辑:

看来我误解了Jackson在这两种情况下是如何使用我的验证器的:

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


所以我认为这是我在我的验证器中应该有的,但正如我之前所说的,似乎我实际上从该数组中获取每个“条目”,并多次调用它。

ujv3wf0j

ujv3wf0j1#

首先,如果你在bean CustomClass上使用annotation注册了你的自定义解析器,那么解析器应该处理CustomClass的一个示例,而不是一个集合,因此应该定义:

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

字符串
现在可以使用Jackson的类型工厂向Map器传递所需的类型信息

JavaType customClassCollection = objectMapper.getTypeFactory().constructCollectionType(List.class, CustomClass.class);
List<CustomClass> beanList = (List<CustomClass>)objectMapper.readValue(stringBean, customClassCollection);

23c0lvtd

23c0lvtd2#

我通过向模型类中的一个属性添加一个自定义的解析器并使用JsonObjectualize annotation的contentUsing()方法来解决这个问题,如下所示:

@JsonDeserialize(contentUsing = MyCustomDeserializer.class)
private List<CustomClass> customClassObjList;

字符串
其中MyCustomDataizer类是自定义的JacksonJSON Dataizer,定义为:

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

wlzqhblo

wlzqhblo3#

这两条线就足够了。

ArrayNode arrayNode = (ArrayNode) objectMapper.readTree(stringBean);
List<CustomClass> response = objectMapper.convertValue(arrayNode, List.class);

字符串
以后再谢我!

相关问题