代码之家  ›  专栏  ›  技术社区  ›  Ivan Pronin

全局配置objectmapper(通过@bean或smth)以从“data”节点解析

  •  0
  • Ivan Pronin  · 技术社区  · 6 年前

    关于so和其他资源,杰克逊有上千个问题,我已经花了几个小时在搜索,但仍然找不到答案。

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

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

    或使用数组:

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

    somedata是一些pojo类,我需要对其进行解析。服务中有许多不同的pojo类。我不在乎 MetaInfo 现在,但我想解决我的问题也有助于解决它。

    我想每个都使用一个pojo类 SomeData 类型处理单个对象和数组的响应。问题在于 data 应该从中开始分析的节点。

    问题 :是否可以全局配置我的 ObjectMapper 仅分析来自 数据 节点?

    所以,我想要这样的短信:

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

    或使用数组:

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

    当然,有一个解决办法-使用 wrapper 包含 数据 节点和 List<SomeData> 比如:

    @JsonIgnoreProperties(ignoreUnknown = true)
    public class SomeDataWrapper  {
    
        @JsonProperty("data")
        private List<SomeData> data;
    
        public List<SomeData> getData() {
            return data;
        }
    }
    

    但从我的角度来看,这是一个开销。所以,在从包装类中取出这些列表时,我基本上应该有两倍于需要的类+开销。

    提前谢谢你的帮助!

    编辑1:

    我想全局配置 对象映射器 寻找 数据 节点。我在用弹簧 RestTemplate 它在调用时处理下面的反序列化。 restTemplate.exchange(..) 方法。所以我想把它委托给spring,不想使用jsonnode/遍历响应数据手动解析每个端点的响应。

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   davidxxx    6 年前

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

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

    然后绘制 JsonNode 给一个 SomeData 阵列 ObjectMapper.treeToValue(TreeNode, Class) 以下内容:

     SomeData[] data = jsonObjectMapper.treeToValue(node, SomeData[].class);
    
        2
  •  0
  •   Ben M    6 年前

    我不知道如果你想使用相同的属性名 data 包含多个不同的 类型 数据(对象数组)。

    我建议在api提供程序方面,这是一个非常糟糕的设计选择,如果您有能力更改它,将其更改为始终返回一个列表,该列表可能是 1 会更理想。

    除此之外,我不知道该怎么告诉 ObjectMapper 那种 数据 任何一个 Foo List<Foo> 是的。