java - 将嵌套 json 映射到 java 字段,无需写入容器名称

标签 java json spring-boot groovy jackson

我有一个休息端点,它返回一个 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/

相关文章:

java - 如何编写自己的序列化器/反序列化器?

java - 识别 Java 中的语法错误

java - 与 char 编码集相关的 XML 解析错误

python - API:Python中使用curl调用URL

c# - json转c#反序列化

spring - 如何在Spring Cloud Stream和Kafka中从同一主题发送和接收

java - 在 spring-boot 中监听存储库事件

java - 如何使用 @ConfigurationProperties 和 @Autowired 测试类

java - 示例套接字应用程序不起作用

java - 解析 JSON 时出现错误