将嵌套的json映射到java字段而不写入容器名称

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将嵌套的json映射到java字段而不写入容器名称相关的知识,希望对你有一定的参考价值。

我有一个rest端点返回一个3级嵌套json,如下所示:

 {
   "user":{
      "departament":{
         "departInfo":{
            "departName":"String"
         }
      }
   }
}

我有一个没有相同3个嵌套级别的java / groovy类:

@JsonIgnorePropertires("ignoreUnknown = true")
class User(){
    String departName
}

当我使用restTemplate进行休息调用时:

User response = restTemplate.exchange(url, HttpMethod.GET,
                                      request, User.class)

jackson没有映射字段departName(因为它不是在我猜的相同嵌套级别),即使使用json ignore属性也是如此。我用这段代码解决了我的问题:

@JsonIgnorePropertires("ignoreUnknown = true")
class User(){
    String departName;

    @JsonProperty("department")
    private void mapDepartmentName(Map<String,Object department) {
        this.departName = ((Map<String,String>)department.get("departInfo")).get("departName");
    }
}

这工作得很好,但我不喜欢它,因为我仍然需要写容器的名字。如果没有明确地编写无用且不必要的容器嵌套jsons,我可以以某种方式解决这个问题(它不一定需要与jackson一起)吗?我想避免更改我的代码,即使容器的名称发生了变化。代码是java / groovy。

答案

将JsonPath添加为依赖项(假设为Maven):

 <dependency>
     <groupId>com.jayway.jsonpath</groupId>
     <artifactId>json-path</artifactId>
     <version>2.3.0</version>
 </dependency>

您只需获取json字符串并使用JsonPath处理它:

String json = "...";
List<String> departNames = JsonPath.read(json, "$..departName");
String firstDepartName = JsonPath.read(json, "$..departName[0]");

由于这是json树解析和遍历引擎,我强烈怀疑它的性能不如Jackson(值得测试),但这为你提供了很多灵活处理json字符串的机会。

以上是关于将嵌套的json映射到java字段而不写入容器名称的主要内容,如果未能解决你的问题,请参考以下文章

将具有无效字符的嵌套字段从 Spark 2 导出到 Parquet [重复]

如何设置映射输入的嵌套 JSON 数组对象的状态

如何将具有嵌套对象的复杂 json 文件映射到 java 对象?

使用GSON将更改字段名称映射到POJO

使用Spring RestTemplate将嵌套的JSON对象映射到Java类

嵌套多映射 Dapper 分页查询中的重复字段名称问题