标签: jsonpath

具有深度过滤器的 JSONPath 表达式

给定以下 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

4
推荐指数
1
解决办法
3342
查看次数

Java动态修改未知JSON的JsonNode

我正在尝试修改一个 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 jackson

4
推荐指数
1
解决办法
5250
查看次数

使用 jsonpath 获取父节点

使用节点 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

4
推荐指数
1
解决办法
1万
查看次数

Json 过滤同级节点上的数据

我是 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 jsonpath

4
推荐指数
1
解决办法
2715
查看次数

JsonPath 中的通配符

我正在解析如下的 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 中的通配符?

java groovy json jsonpath rest-assured

4
推荐指数
2
解决办法
8210
查看次数

How reference AWS step function parallel task output?

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 …

jsonpath amazon-web-services aws-lambda aws-step-functions

4
推荐指数
1
解决办法
3220
查看次数

检查 JSONPath 是否为空字符串

我有以下 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

4
推荐指数
1
解决办法
1万
查看次数

Java - 使用 jsonPath 根据当前值更新 Json

我设法使用 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)

有人知道我如何能够像这样引用旧值吗?
问候,

java jsonpath jayway

4
推荐指数
1
解决办法
8486
查看次数

JSON Path 使用 JSON Path 从父对象和子对象中提取特定字段/数组

给定一个 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)

java json jsonpath

4
推荐指数
1
解决办法
5249
查看次数

如何使用 kubectl -o jsonpath 仅检索 kubectl.kubernetes.io/last-applied-configuration?

我正在尝试使用 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 kubectl

4
推荐指数
2
解决办法
4895
查看次数