当前位置: 首页 > 知识库问答 >
问题:

获取嵌套元素的jsonpath,而不必提供父元素

黎同
2023-03-14

我需要从这个JSON中获取标签所有值作为数组,并放心

这是示例JSON

{
  "additionalProp1": {
    "type": "FADE_IN",
    "applyType": "IN",
    "label": "string",
    "properties": [
      {
        "name": "string",
        "type": "NUMERIC",
        "elementType": "TEXT",
        "label": "string",
        "defaultValue": {},
        "displayOrder": 0,
        "required": true,
        "visible": true,
        "dataset": {
          "type": "string",
          "subtype": "string",
          "filter": "string"
        }
      }
    ]
  },
  "additionalProp2": {
    "type": "FADE_IN",
    "applyType": "IN",
    "label": "string",
    "properties": [
      {
        "name": "string",
        "type": "NUMERIC",
        "elementType": "TEXT",
        "label": "string",
        "defaultValue": {},
        "displayOrder": 0,
        "required": true,
        "visible": true,
        "dataset": {
          "type": "string",
          "subtype": "string",
          "filter": "string"
        }
      }
    ]
  },
  "additionalProp3": {
    "type": "FADE_IN",
    "applyType": "IN",
    "label": "string",
    "properties": [
      {
        "name": "string",
        "type": "NUMERIC",
        "elementType": "TEXT",
        "label": "string",
        "defaultValue": {},
        "displayOrder": 0,
        "required": true,
        "visible": true,
        "dataset": {
          "type": "string",
          "subtype": "string",
          "filter": "string"
        }
      }
    ]
  }
}

使用jsonpath提取器,它是*。label

但我需要放心地提取路径

.extract().path("*.label");

但是它不起作用,我怎么写JSON路径来得到需要的数组呢?

共有2个答案

巴洲
2023-03-14

如果我正确理解了这个问题,您希望提取与键相关的所有值。如果我错了,请纠正我<我不知道如何使用jsonPath实现这一点,但我可以为您提供一些代码<也许你对用代码做这件事不感兴趣。但是,如果您希望以编程方式进行,或者阅读问题的人感兴趣,您可以使用递归实现结果<我用这种方法做其他事情,但我根据你的需要进行了调整。如果需要,您可以查看原始代码。

不管怎样,这里有一个例子:

import org.json.JSONArray;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        String payload = "<YOUR_JSON_PAYLOAD>";

        // Create A json Object
        JSONObject jsonObject = new JSONObject(payload);

        // Initialize a list where store objects
        List<Object> values = new ArrayList<>();

        // Recursively find values by specifying key
        getValuesByKey(values, jsonObject, "label");

        System.out.println(values.toString());
    }


    // recursive
    private static void getValuesByKey(final List<Object> collection, JSONObject jsonObject, String targetKey) {
        for (String key : jsonObject.keySet()) {
            // Our targets
            if (key.equals(targetKey) && (jsonObject.get(key) instanceof String
                    || jsonObject.get(key) instanceof JSONArray
                    || jsonObject.get(key) instanceof Number
                    || null == jsonObject.get(key))) {

                collection.add(jsonObject.get(key));
            } else if (jsonObject.get(key) instanceof JSONObject) {
                // Going through simple JSON Object
                JSONObject modObj = (JSONObject) jsonObject.get(key);

                if (null != modObj) {
                    getValuesByKey(collection, modObj, targetKey);
                }
            } else if (jsonObject.get(key) instanceof JSONArray) {
                // Going through simple JSONArrays
                JSONArray modArray = (JSONArray) jsonObject.get(key);
                
                for (int i = 0; i < modArray.length(); i++) {
                    JSONObject nextObj = modArray.optJSONObject(i);
                    if (null != nextObj) getValuesByKey(collection, nextObj, targetKey);
                }
            }
        }
    }
}

使用json有效负载运行代码,我得到以下输出:< br> [string,string,string,string,string,string]

我稍微修改了有效载荷,以验证值的正确提取,如下所示:

{
  "additionalProp1": {
    "type": "FADE_IN",
    "applyType": "IN",
    "label": "string0",
    "properties": [
      {
        "name": "string",
        "type": "NUMERIC",
        "elementType": "TEXT",
        "label": "string00",
        "defaultValue": {},
        "displayOrder": 0,
        "required": true,
        "visible": true,
        "dataset": {
          "type": "string",
          "subtype": "string",
          "filter": "string"
        }
      }
    ]
  },
  "additionalProp2": {
    "type": "FADE_IN",
    "applyType": "IN",
    "label": "string1",
    "properties": [
      {
        "name": "string",
        "type": "NUMERIC",
        "elementType": "TEXT",
        "label": "string11",
        "defaultValue": {},
        "displayOrder": 0,
        "required": true,
        "visible": true,
        "dataset": {
          "type": "string",
          "subtype": "string",
          "filter": "string"
        }
      }
    ]
  },
  "additionalProp3": {
    "type": "FADE_IN",
    "applyType": "IN",
    "label": "string2",
    "properties": [
      {
        "name": "string",
        "type": "NUMERIC",
        "elementType": "TEXT",
        "label": "string22",
        "defaultValue": {},
        "displayOrder": 0,
        "required": true,
        "visible": true,
        "dataset": {
          "type": "string",
          "subtype": "string",
          "filter": "string"
        }
      }
    ]
  }
}

生成此输出:
[string0、string00、string2、string22、string1、string11]

您需要org.json库来使代码工作:

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20201115</version>
</dependency>
曾嘉言
2023-03-14

此查询应该适合您:

java prettyprint-override">.extract().path("collect{it.value.label}");

注意:如果您有“标签”字段作为可选(可能会错过响应),则输出数组中会有空元素。

回应:

{
    "additionalProp1": {
      "type": "FADE_IN",
      "applyType": "IN",
      "label": "label1"
    },
    "additionalProp2": {
      "type": "FADE_OUT",
      "applyType": "IN",
      "label": "label2"
    },
    "additionalProp5": {
      "type": "FADE_IN",
      "applyType": "IN"
    },
    "additionalProp3": {
      "type": "FADE_IN",
      "applyType": "IN",
      "label": "label3"
    },
    "additionalProp4": {
      "type": "FADE_IN",
      "applyType": "IN"
    }
  }

查询:

ArrayList<String> body = given().when().get("http://localhost:3000/response").then().extract().path("collect{it.value.label}");

输出:

[label1, label2, null, label3, null]
 类似资料:
  • 我正在尝试使用以下结构单击element: 但是,这将抛出。 我当前正在使用:刮取(父)元素列表。这标识了正确的元素列表(按预期工作)。有了列表后,我应用以下函数: 使用: 而且 但是,这将触发。 我对此进行了几个小时的研究,基于几个帖子,我添加了“。”在两个斜杠之前,这表示相对于父级(而不是相对于整个DOM)。 如果我移除这个点,我总是得到页面上的第一个元素--而不是列表中每个父元素的子元素。

  • 问题内容: 这应该真的很简单,但是我遇到了麻烦。如何获得子元素的父div? 我的HTML: 我的JavaScript: 我本来以为还是会工作,但我不断收到错误。请注意,已定义,但不是其中的某些变量。 有任何想法吗? PS我希望尽可能避免使用jQuery。 问题答案: 您正在寻找,其继承自:

  • 问题内容: 假设我有这个标记: 我有这个jQuery: 单击该子项时,如何获得子项相对于其父项的索引? 例如,当您单击“步骤1”时,应弹出带有“ 0”的。 问题答案: 但是,与其为每个列表项附加一个单击处理程序,不如(在性能方面)更好地使用如下所示: 在jQuery 1.7+中,您应该使用。下面的示例将事件绑定到元素,就像委托事件一样工作:

  • 问题内容: 我有一个:before开头的’quote’和一个:after结束的报价。 现在,我想要的是一个:after:after供“引用”参考,但我无法使其正常工作。 有人知道这是否可能吗? 到目前为止,我的代码: 问题答案: 已经提出了嵌套和伪元素的想法;请参阅“生成和替换的内容”模块的这一部分。但是,该模块已被放弃,等待完全重写,因此在重新发布该文档之前,我不会屏息。即便如此,嵌套内容伪元素

  • 问题内容: 我只想从汤中最上面的元素中提取文本;但是汤.text也会给出所有子元素的文本: 我有 输出为。我只想“是”。 实现此目标的最佳方法是什么? 编辑 :我也想在解析’ ‘时输出。 问题答案: 那又如何呢? 编辑: 我想我已经了解了你现在想要的。尝试这个:

  • 我正在尝试为我的项目使用插件,但在运行命令时得到错误。谁能帮助解决这个问题。提前道谢。 我的Build.sbt 名称:=“包装” 版本:=“1.0” enablePlugins(JDKPackagerPlugin) 我的主要班级 我的plugins.sbt