使用 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
鉴于以下 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