一尘不染

用Jackson解析深度嵌套的JSON属性

json

我试图找到一种从的有效载荷中解析嵌套属性的干净方法API

这是JSON有效负载的粗略概括:

{
  "root": {
    "data": {
      "value": [
        {
          "user": {
            "id": "1",
            "name": {
              "first": "x",
              "last": "y"
            }
          }
        }
      ]
    }
  }
}

我的目标是拥有User具有firstNamelastName字段的对象数组。

有人知道干净地解析此内容的好方法吗?

现在,我正在尝试创建一个Wrapper类,并在其中创建一个用于数据,值,用户等的静态内部类。

restTemplate.exchange()用来呼叫端点。


阅读 1291

收藏
2020-07-27

共1个答案

一尘不染

您需要使用JsonPath库,该库仅允许您选择必填字段,然后可以Jackson将原始数据转换为POJO类。解决方案示例如下所示:

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.CollectionType;
import com.jayway.jsonpath.JsonPath;

import java.io.File;
import java.util.List;
import java.util.Map;

public class JsonPathApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        List<Map> nodes = JsonPath.parse(jsonFile).read("$..value[*].user.name");

        ObjectMapper mapper = new ObjectMapper();
        CollectionType usersType = mapper.getTypeFactory().constructCollectionType(List.class, User.class);
        List<User> users = mapper.convertValue(nodes, usersType);
        System.out.println(users);
    }
}

class User {

    @JsonProperty("first")
    private String firstName;

    @JsonProperty("last")
    private String lastName;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    @Override
    public String toString() {
        return "User{" +
                "firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                '}';
    }
}

上面的代码打印:

[User{firstName='x', lastName='y'}]
2020-07-27