SelectTokens 与特定的 c#

问题描述 投票:0回答:1

在我使用下面的“Where”方法的过程中,我到达了 json 中名为“list1”的列表。 我需要在不使用“Where”方法的情况下执行相同的操作,只使用一次“SelectTokens”。

当我尝试这个(test2)时,我只访问最后一项。

var test = jsonVal.SelectTokens("data.list1[*]").Where(x => x.SelectTokens("list2[?(@.value > 15)]").Count() != 0);

var test2 = jsonVal.SelectTokens($"data.list1[*].list2[?(@.value > 15)]");  

ex json:

{
    "data": {
        "list1": [
            {
                "list2": [
                    {
                        "value": 20
                    }
                ]
            },
            {
                "list2": [
                    {
                        "value": 10
                    }
                ]
            }
        ]
    }
}

注意:JSON 可能会造成混淆。基本上我想要的是能够将查询的特定部分传递给变量。

演示小提琴这里.

c# json.net jsonpath
1个回答
0
投票

您可以使用 嵌套过滤器表达式 来选择

list1
的所有条目,这些条目至少有一个
list2
的匹配条目,如下所示:

var items = jsonVal.SelectTokens("data.list1[?(@.list2[?(@.value > 15)])]");        

退回的物品,序列化后,按要求匹配

test
的内容:

[
  {
    "list2": [
      {
        "value": 20
      }
    ]
  }
]

备注:

  • 内部表达式

    list2[?(@.value > 15)]
    选择 list2 中值 > 15 的所有条目。

  • 外层表达式

    data.list1[?(@list2 query)]
    选择 list1 中与 list2 中具有匹配项的所有条目。

  • 我不确定嵌套过滤器表达式是否适用于所有 JSONPath 实现。如果我在 https://jsonpath.curiousconcept.com/ 上尝试上述查询 + JSON,Stefan Goessner 的 JSONPath 0.8.3 和 Flow Communications 的 JSONPath 0.5.0 都无法评估查询。

    JSONPath 提案 只是声明

    ?()
    应该应用过滤器(脚本)表达式“使用底层脚本引擎”,这是非常模糊的。

演示小提琴这里.

© www.soinside.com 2019 - 2024. All rights reserved.