当前位置: 首页 > 面试题库 >

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

罗和煦
2023-03-14
问题内容

我正在使用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"
  }
]

工作。净提琴。

经过实验,似乎jsonpath.curiousconcept.com上的JSONPath实现都不支持此语法,但是它在使用https://github.com/ashphy/jsonpath-
online-evaluator的
jsonpath.com上可以正常工作。该JSONPath提案只是说是一个
脚本表达式,使用底层脚本引擎*
清楚地留下了一些解释的余地是否以及如何“应该”的工作。()
*


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



 类似资料:
  • 我有以下命名查询; 当我执行代码时; 我没有得到Person类型的resultList,即使我已经明确指定了命名查询的参数。相反,我得到的类型是包含对象数组的向量。 如何使查询显式返回“Person”类型?

  • 问题内容: 所以我创建了一个集成脚本,但是由于某种原因它没有显示出正确的结果。我的查询是 结果中出乎意料的一行之一是这个 ID为11的组具有display_style_priority 2000而不是5200。它应显示具有display_style_priority 5200的用户组ID。这是该用户所在的排名最高的组。有人可以指出我做错了什么。 问题答案: 尝试将GROUP BY更改为 其他大多数

  • 该函数提示用户选择石头、纸或剪刀,并将输入更改为小写。如果用户未选择上述选项之一,则返回if语句。但是,如果选择了正确的选项,则会返回其他语句。 但是,如果用户输入适当的响应,else语句不会运行。 如果我输入石头/布/剪刀以外的东西,我希望if语句运行。但是如果我输入石头/纸/剪刀,我希望其他语句运行。 但是,无论如何,else语句都不会运行。

  • 我正在使用JUnit和Mockito库来测试我的应用程序。问题是,当我在代码下面执行时,值在运行时没有返回空列表,并且测试失败。理想情况下,当get执行时,它应该返回空列表 我热切期待着支持。有没有人能帮我一下,如何通过这个测试用例???。如何通过Mockito使第8行的控件通过测试用例??? 请假设,下面两个类没有真实的代码,我们只有二进制文件作为JAR文件,我们不能修改下面的代码....我附上

  • 我在使用MongoDB查询时遇到问题。每当我尝试通过ID或任何其他字段查找时,我总是得到零结果返回。我也很难使用“like”操作符。 我想以不区分大小写的方式查询书名。而且我知道你可以在MongoDB中这样做: 我试着装腔作势地做,但我不能让它起作用: 我看到控制台上打印出以下行:{“title”:{“$regex”:“/^harr.*/I”}} 我也尝试过一个文档,但也不成功: 结果却是零。 这

  • 问题内容: 是否可以以预定顺序进行声明,即 选择ID 7,2,5,9和8 并以该顺序返回它们 ,仅基于ID字段? 这两个语句以相同顺序返回它们: 问题答案: 我不认为这是可能的,但是在这里找到了一个博客条目,似乎可以满足您的需求: 将给不同的结果 返回给定第二个参数的位置,因此对于上面的第一种情况,7的位置在集合中的位置1,2的位置在2,依此类推-mysql在内部得出类似 然后按的结果排序。