将嵌套的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 文件映射到 java 对象?