2009年发布的查询的答案是使用一个新功能JObject.SelectToken
,该功能应该提供类似XPath
的功能。我现在正在使用JSON。NET 4.5 R11和CCD_ 3方法。
但我找不到太多关于要传递给SelectToken
函数的路径字符串的文档(基本上是语法)。
以下代码生成一个Json字符串,我想在该字符串上执行类似Xpath的方法(即,据我所知SelectToken
)
IList branches = new ArrayList();
IList employees = new ArrayList();
employees.Add(new { EmpId = 1, Name = "Name1" });
employees.Add(new { EmpId = 2, Name = "Name2" });
employees.Add(new { EmpId = 3, Name = "Name3" });
IList employees2 = new ArrayList();
employees2.Add(new { EmpId = 4, Name = "Name1" });
employees2.Add(new { EmpId = 5, Name = "Name5" });
branches.Add(new { BranchName = "Branch1", Employees = employees });
branches.Add(new { BranchName = "Branch2", Employees = employees });
string json = JsonConvert.SerializeObject(branches);
var branchesDeserialised = JsonConvert.DeserializeAnonymousType(json, new[] { new { BranchName = "", Employees = new[] { new { EmpId = 0, Name = "" } } } });
JArray ja = JArray.Parse(json);
var AllName1Tokens = ja.SelectToken(@"..Name=""Name1"""); //Get all names that are having Name = "Name1" irrespective of branch
由于我没有类的二进制文件,Json字符串的结构非常庞大,很难使用动态。因此,在反序列化后对对象使用LINQ是不可能的。我也不想将Json字符串转换为XML或其他格式来进行选择。此外,我不想写代码来解析它。
SelectToken
函数的Path
参数的语法是什么?如何选择employees
的所有EmpId
,其中Name=”Name1”
Edit1:如果SelectToken
不能做到这一点,是否可以在JSON字符串上(而不是在真实对象上)使用JObject.Select
(LINQ查询)来获得结果?regex呢?
来自JSON的作者。NET:
自从Json。NET 6.0支持SelectToken,完全支持JSONPath,这是一种类似XPath的JSON查询语言。
JObject o = JObject.Parse(@"{
""Manufacturers"": [
{
""Name"": ""Acme Co"",
""Products"": [
{
""Name"": ""Anvil"",
""Price"": 50
}
]
},
{
""Name"": ""Contoso"",
""Products"": [
{
""Name"": ""Elbow Grease"",
""Price"": 99.95
},
{
""Name"": ""Headlight Fluid"",
""Price"": 4
}
]
}
]
}");
// manufacturer with the name 'Acme Co'
var acme = o.SelectToken("$.Manufacturers[?(@.Name == 'Acme Co')]");
博客文章上的更多详细信息
Can JObject。SelectToken能做XPath能做的事情吗?
SelectToken函数的Path参数的语法是什么?
我相信它只支持到单个令牌(如"branches[0].employees[0].name"
)的字符串路径
如何选择Name="Name1"的所有员工的EmpId?
我不确定SelectToken
能否做到这一点,而且您的问题的限制排除了大多数常见的解决方案。
我找不到太多关于要传递给SelectToken函数的路径字符串。
此处的一些文档:
路径由属性名和数组索引组成,由周期。数组索引可以使用方括号或圆括号。