繁体   English   中英

Json.NET JSONPath查询未返回预期结果

[英]Json.NET JSONPath query not returning expected results

我正在使用Newtonsoft的Json.Net从以下json中选择节点:

{  
   "projects":[  
      {  
         "name":"Project 1",
         "client":{  
            "code":"ABC",
            "name":"Client 1"
         }
      },
      {  
         "name":"Project 2",
         "client":{  
            "code":"DEF",
            "name":"Client 2"
         }
      },
      {  
         "name":"Project 3",
         "client":{  
            "code":"GHI",
            "name":"Client 3"
         }
      }
   ]
}

以下c#片段

//json is a JObject representation of the json listed above
var clients =  json.SelectTokens("$.projects[*].client");

产量:

[  
   {  
      "code":"ABC",
      "name":"Client 1"
   },
   {  
      "code":"DEF",
      "name":"Client 2"
   },
   {  
      "code":"GHI",
      "name":"Client 3"
   }
]

这很酷,现在,我想做的是按客户端代码过滤,我会这么认为

$.projects[*].client[?(@.code == 'DEF')]

会工作,但我显然不太了解语法。 这将返回一个空列表:

 var test1 =  json.SelectTokens("$.projects[*].client[?(@.code == 'DEF')]").ToList();

单个标记选择器返回null:

  var test2 =  json.SelectToken("$.projects[*].client[?(@.code == 'DEF')]");

我在https://jsonpath.curiousconcept.com/上尝试了一些不同的配置,看起来我的查询语法确实破了。

使用Flow Communications的JSONPath 0.3.4实现(在上面的链接上)我可以使用

$..[?(@.code == 'DEF')]

但是,这种语法似乎对Json.Net不起作用(也不是同一页面上的Goessner实现)。

有谁看到我做错了什么?

Json.NET的JSONPath解析器允许过滤器(脚本)表达式[?( )]查询候选数组项的子对象内的嵌套属性。 从而

var test = json.SelectTokens(@"$.projects[?(@.client.code == 'DEF')].client");

根据需要返回

[
  {
    "code": "DEF",
    "name": "Client 2"
  }
]

工作.Net小提琴

在实验似乎没有JSONPath实现在jsonpath.curiousconcept.com支持这个语法,但它工作正常,在jsonpath.com它采用https://github.com/ashphy/jsonpath-online-evaluator JSONPath提议简单地声明()是一个脚本表达式,使用底层脚本引擎 ,这显然留下了一些空间来解释这个“应该”是否以及如何工作。

问题中使用的过滤器显然不适用于Json.NET,因为从版本10.0.3开始,它只正式支持将过滤器应用于数组项而不是直接应用于对象 - 请参阅问题#1256:JSONPath脚本未正确执行讨论的对象 (虽然有时可以找到狡猾的解决方法,例如在这个答案中 。)然而,在过滤器中使用嵌套属性似乎是有效的(并且确实有效)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM