我有一个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。
答案 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字符串的机会。