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

时间:2018-03-03 11:45:06

标签: java json spring-boot groovy jackson

我有一个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? 即使容器的名称发生变化,我也希望避免更改我的代码。代码是java / groovy。

1 个答案:

答案 0 :(得分: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字符串的机会。