Json.net:JObject.SelectToken可以做XPath可以做的事情吗?如果是,语法是什么?

key*_*eyr 6 c# regex xml xpath json.net

2009年发布的查询的答案是使用一个JObject.SelectToken应该提供XPath类似功能的新功能.我现在使用的是JSON.NET 4.5 R11,SelectToken方法可用.

但是我找不到关于要传递给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
Run Code Online (Sandbox Code Playgroud)

由于我没有类的二进制文件和Json字符串的结构是如此巨大,以至于很难使用动态.因此,在反序列化后无法在对象上使用LINQ.我不想将Json字符串转换为XML或其他格式来进行选择.另外我不想编写代码来解析它.

函数Path参数的语法是什么SelectToken?我该如何选择所有EmpIdemployees地方Name=”Name1”

Edit1:是否有可能JObject.Select在JSON字符串(而不是真实对象)上使用(LINQ查询)获取结果,以防SelectToken无法执行此操作?正则表达式怎么样?

ITm*_*eze 3

来自 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')]");
Run Code Online (Sandbox Code Playgroud)

博客文章中有更多详细信息