给定以下 JSON 数组
[
{
"id":1,
"list":[
{"id":1,"type":{"ref":1,"tema":3}},
{"id":2,"type":{"ref":1,"tema":6}}
]
},...
]
Run Code Online (Sandbox Code Playgroud)
使用 jsonPath 表达式,如何获取所有 type.ref==1 的列表元素?在我通过 Google 找到的所有示例中,我找不到具有 2 个级别的过滤器。
我正在尝试修改一个 JSON(结构未知),其中 JsonPath 及其等效的 XML Xpath 是我已知的。
我已经厌倦了使用com.jayway.jsonpath.JsonPath图书馆。JsonPath 的问题是,它返回值但我无法修改目标节点。
以下是我的代码片段
JsonPath.read(jsonFile, jsonPath);
JsonPath.parse(jsonPath);
System.out.println("Author: "+JsonPath.read(jsonFile, jsonPath));
Run Code Online (Sandbox Code Playgroud)
我尝试使用之前问过的问题中提到的杰克逊,但它需要按如下方式逐个节点遍历
((ObjectNode) parent).put(fieldName, newValue);
Run Code Online (Sandbox Code Playgroud)
由于未知的结构,我无法做到这一点。
我已经尝试了递归解析 JSON 对象问题的答案,但它说明了如何解析而不是修改
我需要做以下事情
JsonNode root = mapper.readTree("Json in form of String");
((JsonNode)(root.get("JsonPath")).set("New Value");
Run Code Online (Sandbox Code Playgroud)
有什么方法可以实现吗?
使用节点 JSONPath,如何从子节点值中获取父节点名称
{
"store": {
"book": [
{
"id":"1",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{
"id":"2",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
}
]
}
}Run Code Online (Sandbox Code Playgroud)
我用这个表达式根据值来识别子节点,我想用这个子节点来找到父节点
$.[?(@.id =="1")]
Run Code Online (Sandbox Code Playgroud) 我是 JSONPath 的新手,任何帮助表示赞赏。我正在尝试根据其同级值过滤数据。
我的 JSON 示例:
[
{
"id": "10300",
"name": "NAME1"
},
{
"id": "10500",
"name": "NAME2"
}
]
Run Code Online (Sandbox Code Playgroud)
我想通过名称查询 id。我试过这样的事情,但没有运气:
$..id[?(@name=='NAME1')]
Run Code Online (Sandbox Code Playgroud)
我确定我错过了一些微不足道的东西。
我正在解析如下的 JSON:
jobs1: [
{
request: {
body: {
jobID: "79ceeeff-53b9-4645-80bd-95dfca6fe1e9",
...
jobs2: [
{
request: {
body: {
jobID: "60e7c286-f936-4f96-87bc-6bd55f107514",
Run Code Online (Sandbox Code Playgroud)
并寻找一种在 JSON 路径中使用通配符的方法。
我在 Java 中使用RestAssured框架。执行如下代码后:
List<String> ids = get("/state/").path("*.request.body.jobID");
System.out.println(ids);
Run Code Online (Sandbox Code Playgroud)
我希望得到:
[79ceeeff-53b9-4645-80bd-95dfca6fe1e9, 60e7c286-f936-4f96-87bc-6bd55f107514]
Run Code Online (Sandbox Code Playgroud)
但相反,我得到了一个例外:
java.lang.IllegalArgumentException: Invalid JSON expression:
Script1.groovy: 1: unexpected token: *. @ line 1, column 27.
*.request.body.jobID
^
Run Code Online (Sandbox Code Playgroud)
我已经浏览了这些教程,但似乎没有什么对我有用:
https://github.com/json-path/JsonPath
http://goessner.net/articles/JsonPath
如何正确使用 JsonPath 中的通配符?
I have a parallel task in the step function that contains two branches. The input was:
{
"database": "test",
"userName": "tester",
"userID": "test123",
"adGroup": "testADGroup",
"dbGroup": "ReadGroup"
}
Run Code Online (Sandbox Code Playgroud)
Each branch return a json result like the following
Branch 1 (I used "OutputPath": "$"):
{
"requestType": "GrantAccess",
"DBUser": "exists",
"ADUser": "exists"
}
Run Code Online (Sandbox Code Playgroud)
Branch 2 (I used "ResultPath": "$.approvalStatus"):
{
"database": "test",
"userName": "tester",
"userID": "test123",
"adGroup": "testADGroup",
"dbGroup": "ReadGroup"
"approvalStatus": "Approved"
}
Run Code Online (Sandbox Code Playgroud)
When both the branches complete, the output of the …
我有以下 JSON 字符串:
{
"myKey": "myValue"
}
Run Code Online (Sandbox Code Playgroud)
我想检查这个字符串是否不为空。我可以做这个:
$.myKey
Run Code Online (Sandbox Code Playgroud)
获取 myKey 的值。我尝试将其更改为
$.[?(@.myKey.length()>0)]
Run Code Online (Sandbox Code Playgroud)
(根据本主题表达式使用 `jsonPath` 过滤掉具有空数组的元素)甚至是这样:
$.myKey.length()>0
Run Code Online (Sandbox Code Playgroud)
但我收到错误消息,它不是有效的 JSONPath 表达式。
我将“JsonPath Match”添加到项目中的测试步骤中。当我将其设置为
$.myKey
Run Code Online (Sandbox Code Playgroud)
然后按“从当前选择”,它就可以了。为了
$.[?(@.myKey != '')]
Run Code Online (Sandbox Code Playgroud)
当我按“从当前选择”时,我得到
“无效的 JsonPath 表达式”
我使用 SoapUI 5.4.0 但我不知道如何检查其 JsonPath 实现。如果字符串为空,我想得到 false。
如何检查 myValue 是否为空?谢谢!
我设法使用 jsonPath 和此代码更新 json 对象
JSONObject json = new JSONObject("{\"data\":[{\"city\":\"New York\",\"name\":\"John\",\"age\":31},{\"city\":\"Paris\",\"name\":\"Jack\",\"age\":12}]}");
DocumentContext doc = JsonPath.parse(json.toString())
.set("$..name","newName");
System.out.println("doc.jsonString() = " + doc.jsonString());
Run Code Online (Sandbox Code Playgroud)
输出:
doc.jsonString() = {"data":[{"city":"New York","name":"newName","age":31},{"city":"Paris","name":"newName","age":12}]}
Run Code Online (Sandbox Code Playgroud)
现在我想根据旧值更新值(通过对旧值应用函数
)
DocumentContext doc = JsonPath.parse(json.toString())
.set("$..name",upper(oldValue))
.set("$..age", oldValue+10);
Run Code Online (Sandbox Code Playgroud)
这将导致以下 json
doc.jsonString() = doc.jsonString() = {"data":[{"city":"New York","name":"JOHN","age":41},{"city":"Paris","name":"JACK","age":22}]}
Run Code Online (Sandbox Code Playgroud)
有人知道我如何能够像这样引用旧值吗?
问候,
给定一个 JSON 对象,例如:
"book": [
{
"category": "reference",
"author": "Nigel Rees",
"book_id": "214515",
"title": "Sayings of the Century",
"price": 8.95,
"reviews": [
{
"rating": 2,
"reviewer": "Amazon",
"weight": 0
},
{
...
}
]
},
{
...
}
Run Code Online (Sandbox Code Playgroud)
是否可以选择 book_id 以及该书的部分或全部评论?
结果可能看起来像这样:
[
{
"book_id": "...",
"reviews": [
...
]
},
{
...
}
]
Run Code Online (Sandbox Code Playgroud)
我一直在使用 Jayway jsonpath: https: //github.com/json-path/JsonPath
在处理数组(例如“评论”)然后以编程方式加入时,以下方法不适合:
List ids = JsonPath.read(json, "$.store.books[*].book_id");
List reviews = JsonPath.read(json, "$.store.books[*].reviews[*]");
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 kubectl -o jsonpath 从服务 yaml(在元数据注释下)检索 kubernetes last-applied-configuration,但该字段的名称是“kubectl.kubernetes.io/last-applied-configuration”。我相信解析器会因为实际名称字段中的点而感到困惑,因为它使用点来指定子对象。
例如(在 Windows 上运行)
kubectl -lapp=myapp get service -o jsonpath="{range .items[*]}{
.metadata.annotations}{\"\n\"}{end}"
Run Code Online (Sandbox Code Playgroud)
按预期显示结果值的映射
map[kubectl.kubernetes.io/last-applied-configuration:{"kind":"Service","apiVersion":"v1","metadata":{"name":"myapp","namespace":"mynamespace",
"creationTimestamp":null,"labels":{"app":"myapp","version":"1.0"}},"spec":{"ports":[{"name":"http","protocol":"TCP","port":80,"ta
rgetPort":8080}],"selector":{"app":"myapp","version":"1.0"},"type":"NodePort"},"status":{"loadBalancer":{}}}]
Run Code Online (Sandbox Code Playgroud)
在这种情况下, kubectl.kubernetes.io/last-applied-configuration 是注释中唯一的内容,但情况并非总是如此。
当我尝试深入到最后应用的配置时,问题就出现了。
例如
kubectl -lapp=myapp get service -o jsonpath="{range .items[*]}{
.metadata.annotations.kubectl.kubernetes.io/last-applied-configuration}{\"\n\"}{end}"
Run Code Online (Sandbox Code Playgroud)
不返回任何信息。
我也试过
kubectl -lapp=myapp get service -o jsonpath="{range .items[*]}{
.metadata.annotations['kubectl.kubernetes.io/last-applied-configuration']}{\"\n\"}{end}"
Run Code Online (Sandbox Code Playgroud)
和
kubectl -lapp=myapp get service -o jsonpath="{range .items[*]}{['metadata']['annotations']['kubectl.kubernetes.io/last-applied-configuration']}{\"\n\"}{end}"
Run Code Online (Sandbox Code Playgroud)
无济于事。
我期望结果只是 kubectl.kubernetes.io/last-applied-configuration 的值
jsonpath ×10
json ×4
java ×3
aws-lambda ×1
groovy ×1
jackson ×1
jayway ×1
kubectl ×1
rest-assured ×1