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

时间:2019-09-17 16:52:41

标签: java json jackson mapping json-deserialization

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

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

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

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

有人知道干净地解析它的好方法吗?

现在,我正在尝试创建一个Wrapper类,并且在其中具有用于数据,值,用户等的静态内部类。但这似乎只是读取first /数组的一种混乱方式最后的属性。

我正在使用restTemplate.exchange()来呼叫端点。

2 个答案:

答案 0 :(得分:2)

您需要使用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'}]

答案 1 :(得分:0)

使用lib org.json.simple的另一种简单方法

JSONParser jsonParser = new JSONParser();
        //Read JSON file
        Object obj = jsonParser.parse(reader);

        JSONObject jObj = (JSONObject) obj;

        JSONObject root = (JSONObject)jObj.get("root");
        JSONObject data = (JSONObject) root.get("data");
        JSONArray value =  (JSONArray) data.get("value");
        JSONObject array = (JSONObject) value.get(0);
        JSONObject user = (JSONObject) array.get("user");
        JSONObject name = (JSONObject) user.get("name");

        String lastName = (String) name.get("last");
        String firstName = (String) name.get("first");

        System.out.println(lastName + " " + firstName);