使用 JSON Path in Json.net 检查是否存在具有特定值的属性

Checking if properties with specific values exist with JSON Path in Json.net

鉴于以下 JSON:

{
    "pos":123,
    "name":"Bla"
}

我正在尝试验证所提供的 JSON 是否具有 name 属性 的值 Bla

根据 json.net 上的文档,我确定这应该有效:

$.[?(@.name == 'Bla')]

我在 https://jsonpath.herokuapp.com/ 上验证了这个想法,如果它是真的,它似乎 return 对象,如果不是,则什么都不是

然而,当在 json.net 中尝试相同时,它似乎从来没有 return 一个有效的 JToken。

此处的示例代码: https://dotnetfiddle.net/0agXyZ(将 true 传递给 SelectToken 表示如果未找到结果应该抛出错误,我也没有看到) .

这是我做错了什么吗?

我想做的是编写一个测试,这将允许开发人员指定预期 JSON 从他们的测试中 returned,所以对我来说,如果有一种为他们提供以 JSON 路径格式输入验证字符串的方法 我可以在我的框架中隐藏此验证的详细信息。

谢谢。

正如@dbc 在上面的评论中指出的那样,JSONPath 搜索过滤器适用于数组。您仍然可以在一个对象中追踪某个个体 属性,看看它是否存在。

扩展在 dotnetfiddle 上发布的示例。

using System;
using System.Xml;
using System.Xml.Linq;
using System.Linq;
using Newtonsoft.Json.Linq;
using System.Text.RegularExpressions;
                    
public class Program
{
    public static void Main()
    {
        var json = @"{'pos':123,'name':'Bla'}";
        var jobj = JObject.Parse(json);

        Console.WriteLine("Looking for 'name'");
        JToken token = jobj.SelectToken("$.name");
        if (token == null) Console.WriteLine("error");
        Console.WriteLine(token);
        
        Console.WriteLine("Looking for 'names'");
        token = jobj.SelectToken("$.names");
        if (token == null) Console.WriteLine("error");
        Console.WriteLine(token);

        
        var json2 = @"{
            'data': [
                {
                    'pos':123,
                    'name':'Bla'
                },
                {
                    'pos':123,
                    'name':'Bla2'
                },
                {
                    'pos':123,
                    'name':'Bla3'
                }
            ]
        }";
        var jobj2 = JObject.Parse(json2);

        Console.WriteLine("Looking for 'name == 'Bla2'' in array.");
        JToken token2 = jobj2.SelectToken("$.data[?(@.name == 'Bla2')]");
        if (token2 == null) Console.WriteLine("error");
        Console.WriteLine(token2);
    }
}

结果是:

Looking for 'name'
Bla
Looking for 'names'
error

Looking for 'name == 'Bla2'' in array.
{
  "pos": 123,
  "name": "Bla2"
}

json 路径对 jobject 无效,它用于集合。对于你的json,你可以使用这个

var json=@"{
        ""pos"":123,
        ""name"":""Bla""
        }";
    
    var jsonObject=JObject.Parse(json);
    bool thereIsName =(string)jsonObject.SelectToken("name")=="Bla"; //True

您可以为类似的 json

使用 json 路径
var json=@"[{
    ""pos"":123,
    ""name"":""Bla""
    }]";

var jsonArray=JArray.Parse(json);

bool thereIsName = jsonArray.SelectToken("$[?(@.name == 'Bla')]")!=null; //True