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

问题描述 投票:0回答:1

我有一个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。

java json spring-boot groovy jackson
1个回答
1
投票

将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字符串的机会。

© www.soinside.com 2019 - 2024. All rights reserved.