我有一个休息端点,它返回一个 3 级嵌套 json,如下所示:
{
"user":{
"departament":{
"departInfo":{
"departName":"String"
}
}
}
}
我有一个 java/groovy 类,没有相同的 3 个嵌套级别:
@JsonIgnorePropertires("ignoreUnknown = true")
class User(){
String departName
}
当我使用restTemplate进行休息调用时:
User response = restTemplate.exchange(url, HttpMethod.GET,
request, User.class)
即使使用 json 忽略属性,jackson 也不会映射字段 DepartName (因为我猜它不在同一嵌套级别)。我已经用这段代码解决了我的问题:
@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");
}
}
它工作得很好,但我不太喜欢它,因为我仍然需要写容器的名称。我可以以某种方式解决这个问题(不一定需要与 Jackson 一起),而无需显式编写无用且不必要的容器嵌套 json 吗? 即使容器的名称发生变化,我也想避免更改我的代码。代码是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 字符串。
关于java - 将嵌套 json 映射到 java 字段,无需写入容器名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49083762/