Java 全局配置ObjectMapper(通过@Bean或smth)以从;“数据”;节点

Java 全局配置ObjectMapper(通过@Bean或smth)以从;“数据”;节点,java,json,jackson,mapper,Java,Json,Jackson,Mapper,在SO和其他资源上有数千个jackson问题,我已经花了几个小时搜索,但仍然无法找到答案 我尝试使用REST web服务,它以通常的单对象json格式返回信息,如: { "data" : { SomeData }, "meta: : {MetaInfo} } 或使用阵列: { "data" : [ {SomeData}, {SomeData} ], "meta: : {MetaInfo} } SomeData是一些POJO类,我需要对其进行解析。服务中有几十个不同的POJO类

在SO和其他资源上有数千个jackson问题,我已经花了几个小时搜索,但仍然无法找到答案

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

{
  "data" : { SomeData },
  "meta: : {MetaInfo}
}
或使用阵列:

{
  "data" : [ {SomeData}, {SomeData} ],
  "meta: : {MetaInfo}
}
SomeData是一些POJO类,我需要对其进行解析。服务中有几十个不同的POJO类。我现在不关心MetaInfo,但我想我的问题的解决方案也会有助于解决它

我希望每个
SomeData
类型使用一个POJO类来处理单个对象和数组的响应。问题在于我应该从这个
数据
节点开始解析

问题:是否可以全局配置我的
ObjectMapper
,只解析
数据
节点中的信息

所以,我想要这样的smth:

SomeData data = new ObjectMapper().fromNode("data").readValue(inputString, SomeData.class);
或使用阵列:

List<SomeData> listData = new ObjectMapper().fromNode("data").readValue(inputString, new TypeReference<List<SomeData>>() {});
但在我看来,这是一种开销。所以,我基本上应该有两倍于所需的类+从包装器类中取出这些列表的开销

提前感谢您的帮助

EDIT1:

我想全局配置
ObjectMapper
以查找
数据
节点。我使用的是Spring
RestTemplate
,当调用例如
RestTemplate.exchange(…)
方法时,它在下面处理反序列化。因此,我希望将其委托给Spring,而不希望使用JsonNode/遍历响应数据手动解析每个端点响应

EDIT2:
我知道我可以使用jackson的
模块定义
@Bean
,并注册自定义反序列化程序,但我需要为每个POJO定义一个新的反序列化程序类。这将是一个巨大的痛苦和样板文件

假设您希望使用相同的确切属性名
数据
来包含多种不同类型的数据(对象|数组),我不知道有什么方法可以实现这一点

我建议,在API提供者方面,这是一个非常糟糕的设计选择,如果您有任何能力更改它,将其更改为始终返回一个列表,该列表的大小可以是
1
,这将非常理想


除此之外,我不知道有什么方法可以告诉
ObjectMapper
数据的类型是
Foo
List
将JSON反序列化为
TreeNode
ObjectMapper.readTree(String)
并选择要映射的路径,例如:

JsonNode node = new ObjectMapper().readTree(inputString)
                                  .path("data");
然后使用
ObjectMapper.treeToValue(TreeNode,Class)
JsonNode
映射到
SomeData
数组:


很好的提示,我不知道这个方法,谢谢!但是,我希望全局配置
ObjectMapper
以查找
数据
节点。我使用的是SpringRestTemplate,当调用例如
RestTemplate.exchange(…)
方法时,它在下面处理反序列化。所以我想把它委托给Spring,而不想手动解析每个端点响应。可能吗?添加到问题you's welcome:)我不明白,如果不为每个类指定反序列化器,如何轻松地对一组类进行反序列化。但您不必为每一个创建不同的。可以使用所需的类对其进行参数化。除此之外,为了避免维护设置,您还可以引入一个自定义注释,添加到类上,并添加一个配置处理,在启动时为每个注释类实例化一个反序列化器。写起来应该不难。我认为它在某种程度上是有意义的——将
重要的
数据从
元信息
中分离出来,比如计划订阅或响应时间戳。我不能以任何方式改变回应。但是如果我可以配置
mapper
来抓取
数据
节点,我可以根据端点简单地指定所需的输出(对象/数组),但是您仍然会遇到这样一个事实,即
某些数据的类型
!=<代码>列表类型
。没有办法告诉对象映射器“尝试将其反序列化为对象,如果不起作用,则尝试将其作为列表”,因为这是唯一可以实现的方法。根据端点的不同,我可以这样做。借助于
newtypereference(){})
SomeData.class
-我知道哪个端点返回什么类型的数据。使用自定义反序列化程序也可以-我们分析
数据
节点,以及它是否是数组-当然,如果您是以编程方式执行的话,则生成对象或数组序列。但是我看不到任何配置全局ObjectMapper的方法,除非使用上面指定的包装器类。
JsonNode node = new ObjectMapper().readTree(inputString)
                                  .path("data");
 SomeData[] data = jsonObjectMapper.treeToValue(node, SomeData[].class);