为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

翻过高山走不出你 2023-08-04 15:16:45
我正在尝试找到一种干净的方法来解析API.以下是有效负载的粗略概括JSON:{  "root": {    "data": {      "value": [        {          "user": {            "id": "1",            "name": {              "first": "x",              "last": "y"            }          }        }      ]    }  }}我的目标是拥有一组User具有firstName和lastName字段的对象。有谁知道一个干净地解析这个的好方法吗?现在我正在尝试创建一个Wrapper类,并在其中包含用于数据、值、用户等的静态内部类,但这似乎是一种混乱的方式,只是为了读取第一个/最后一个属性的数组。我用来restTemplate.exchange()调用端点。
查看完整描述

2 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

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'}]


查看完整回答
反对 回复 2023-08-04
?
慕斯709654

TA贡献1840条经验 获得超5个赞

另一种简单的方法是使用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);


查看完整回答
反对 回复 2023-08-04
  • 2 回答
  • 0 关注
  • 159 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信