java - 请放心(JAVA): Extract json object value given it's parent object value

标签 java json rest-assured rest-assured-jsonpath

假设我有以下 json:

{
  "page": 2,
  "per_page": 3,
  "total": 12,
  "total_pages": 4,
  "data": [
 {
    "id": 4,
    "first_name": "Eve",
    "last_name": "Holt",
    "avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/marcoramires/128.jpg"
},
{
    "id": 5,
    "first_name": "Charles",
    "last_name": "Morris",
    "avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/stephenmoon/128.jpg"
},
{
    "id": 6,
    "first_name": "Tracey",
    "last_name": "Ramos",
    "avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/bigmancho/128.jpg"
}]}

我只想提取属于 id = 6 的“first_name”的值。

我可以用其他方法克服这个问题,但我想知道是否有直接的方法可以让我放心

到目前为止我已经尝试过的事情: data.find { it.id == '6' }.first_name

这可能吗?如果是真的,该怎么办? 谢谢。

最佳答案

我不确定这个解决方案是否是您正在寻找的,但您绝对可以根据 id 提取名字。

放心中使用JsonPath库。您可以将 JSON 作为字符串 JsonPath.from("json string") 传递,也可以从 Response 获取它,如下所示:

JsonPath path = response.jsonPath();

然后,您可以获得 data 数组并迭代其元素,如下所示:

    List<HashMap<String, Object>> data = path.getList("data");
    for (HashMap<String, Object> singleObject : data) {
        if (singleObject.get("id").equals(6)) {
            System.out.println(singleObject.get("first_name"));
        }
    }

上面的代码会将名称“Tracey”打印到控制台。 您可以使用此代码或创建一个基于 id 返回参数的方法,如下所示:

    private static String getFirstNameById(JsonPath path, int id) {
        List<HashMap<String, Object>> data = path.getList("data");
        for (HashMap<String, Object> singleObject : data) {
            if (singleObject.get("id").equals(id)) {
                return (String) singleObject.get("first_name");
            }
        }
        throw new NoSuchElementException(String.format("Can't find first_name with id: %d", id));
    }

只是为了确保您理解 - data 数组中的每个元素都是 JSON 对象。我们使用 getList 方法收集所有对象。每个对象都由StringObjectHashMap表示,因为它包含不同的类型。 first_name 是 String,id 是 Integer,这就是为什么我们必须使用 Objects 的 HashMap 作为第二个泛型参数。

然后我们迭代 HashMap,比较每个 JSON 对象的 id 以获得所需的结果。

如果您愿意,还可以使用Java Stream。相同的方法如下所示:

List<HashMap<String, Object>> data = JsonPath.from(json).getList("data");
Optional<String> firstName = data.stream().filter(x -> x.get("id").equals(6)).map(x -> (String) x.get("first_name")).findFirst();
if (firstName.isPresent()) {
    System.out.println(firstName.get());
}

关于java - 请放心(JAVA): Extract json object value given it's parent object value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56237269/

相关文章:

java - 如何将连接返回到池

java - 如何在 Eclipse 中调试 "Errors occurred during the build"?

java - NetBeans 平台应用程序品牌名称限制

java - Swagger 内容序列化为 java POJO

java - 功能级别的任何 cucumber Before 和 After Hook

java - 如何将参数从 php 发送到 blackberry/Java 移动应用程序

ios - 来自 JSON 的字典中的键

javascript - 具有自定义 JSON 格式的 Ember RESTAdapter

mysql - 存储json,双引号转义问题

java - 想要通过java获取嵌套的JSON数据(计数值)