gpt4 book ai didi

java - 全局配置ObjectMapper(通过@Bean或smth)从 "data"节点解析

转载 作者:行者123 更新时间:2023-12-02 10:54:39 29 4
gpt4 key购买 nike

关于 SO 和其他资源有数千个 jackson 问题,我已经花了几个小时搜索,但仍然无法弄清楚。

我正在尝试使用 REST Web 服务,它以通常的单个对象 json 格式返回信息,例如:

{
"data" : { SomeData },
"meta: : {MetaInfo}
}

或使用数组:

{
"data" : [ {SomeData}, {SomeData} ],
"meta: : {MetaInfo}
}

SomeData 是一些 POJO 类,我需要解析它。服务中有几十个不同的 POJO 类。我不在乎MetaInfo目前,但我认为解决我的问题也将有助于解决它。

我想每个 SomeData 使用一个 POJO 类类型来处理单个对象和数组的响应。而问题就出在这个data我应该开始解析的节点。

问题:是否可以全局配置我的 ObjectMapper仅解析来自 data 的信息节点?

所以,我想要这样的东西:

SomeData data = new ObjectMapper().fromNode("data").readValue(inputString, SomeData.class);

或使用数组:

List<SomeData> listData = new ObjectMapper().fromNode("data").readValue(inputString, new TypeReference<List<SomeData>>() {});

当然有一个解决方法 - 使用 wrapper包含 data 的对象节点和 List<SomeData>像:

@JsonIgnoreProperties(ignoreUnknown = true)
public class SomeDataWrapper {

@JsonProperty("data")
private List<SomeData> data;

public List<SomeData> getData() {
return data;
}
}

但从我的角度来看,这是一个开销。因此,我基本上应该拥有所需数量的两倍 + 从包装类中取出这些列表的开销。

预先感谢您的帮助!

编辑1:

我想全局配置ObjectMapper寻找data节点。我正在使用 Spring RestTemplate当调用例如时,它会在下面处理反序列化restTemplate.exchange(..)方法。所以我想将其委托(delegate)给 Spring,不想使用 JsonNode 手动解析每个端点响应/遍历响应数据。

编辑2:我知道我可以定义 @Bean与 jackson 的Module并注册自定义反序列化器,但我再次需要为每个 POJO 定义一个新的反序列化器类。这将是一个巨大的痛苦和样板

最佳答案

使用 ObjectMapper.readTree(String) 将 JSON 反序列化为 TreeNode 并选择要映射的路径,例如:

JsonNode node = new ObjectMapper().readTree(inputString)
.path("data");

然后使用 ObjectMapper.treeToValue(TreeNode, Class)JsonNode 映射到 SomeData 数组:

 SomeData[] data = jsonObjectMapper.treeToValue(node, SomeData[].class);

关于java - 全局配置ObjectMapper(通过@Bean或smth)从 "data"节点解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51865995/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com