我需要从这个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路径来得到需要的数组呢?
如果我正确理解了这个问题,您希望提取与键相关的所有值。如果我错了,请纠正我<我不知道如何使用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>
此查询应该适合您:
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