Java 全局配置ObjectMapper(通过@Bean或smth)以从;“数据”;节点
在SO和其他资源上有数千个jackson问题,我已经花了几个小时搜索,但仍然无法找到答案 我尝试使用REST web服务,它以通常的单对象json格式返回信息,如: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类
{
"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
以查找数据
节点。我使用的是SpringRestTemplate
,当调用例如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);