当前位置: 首页 > 面试题库 >

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

袁何平
2023-03-14
问题内容

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

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

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

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

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

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

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


问题答案:

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


 类似资料:
  • 我已经试过各种方法来解决这个问题了。但没有成功。 我有几节这样的课 在这种情况下,T可以是任何对象,并且应该可以在运行时解析。 Jackson真的无法将json反序列化为泛型类型吗?

  • 我能够使用类解析嵌套json字符串。这里的问题是,解析嵌套json变得越来越困难,因为我不得不编写大量样板代码来实现将json解析为java对象的最终结果。在spring中,除了这种方法之外,还有什么更好的解析方法吗? 域类: 组件类 属性类: 控制器类: json文件: 如前所述,解析可以使用实例完成,但要使用大量样板代码和硬编码json元素名。有没有更好的办法?我使用库解析json文件。 我参

  • 我已经编写了糟糕的代码来解析上面的json数组。下面是我使用的代码, 有谁能帮助我知道使用Jackson解析JSON吗?我们非常感谢你的帮助。

  • 问题内容: 我正在尝试从上述JSON检索邮政编码。我正在用gson解析它。我是JSON的新手,从我在这里的所有文章中读到的内容(有些与此类似),我都知道字段名称应保持原样。所以我知道我必须做出4类,即响应,视图,结果和地址。我使它们成为静态嵌套类,但是我只得到空值作为输出。在下一个JSON中,我有多个地址。但是我只停留在这个单一的回应上。 举一个简短的例子,我尝试使用此代码检索Timestamp,

  • 我想做的是使用Gson将嵌套的json数据解析为Java对象,并使用自定义的toString()将其打印出来。 Json内容 POJO类:示例 POJO类:JsonFormatter 我的POJO还有其他类,我试图将其解析为Gson的方式是: 但是当我试图打印出它的子值时,比如 我得到了错误: 我想实现的是将上面的json内容打印成这样: 谁能帮我解决这个问题吗?提前谢谢!

  • 问题内容: 如何使用JSON.NET从JSON中获取“ myThings”数组,如下所示? 范例1: 范例2: 我遇到的一些困难: 属性名称之一是不可预测的数字(“ 1234”和“ 7890”) 有时“ myThings”数组不存在-在这种情况下,我想要的是null或空数组/集合 可以帮助您的另一个考虑因素:我确实有一个静态类来表示myThings数组中的内容,所以我的理想返回值是 我的第一个尝试