Json.net: Can JObject.SelectToken сделать то же самое, что XPath может сделать? Если да, то каков синтаксис?

ответ запрос опубликовано в 2009 году, чтобы использовать новую функцию JObject.SelectToken, который должен был доставить XPath как функциональность. Теперь я использую JSON.NET 4.5 R11 и SelectToken метод доступен.

но я не смог найти много документации (в основном синтаксиса) относительно строки пути, которая должна быть передана .

следующий код создает строку Json и на которой я хотел бы выполнить метод Xpath like (т. е. для моего знание 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 настолько огромна, что будет сложно использовать dynamic. Поэтому использование LINQ для объектов после де-сериализации невозможно. Я не хочу преобразовывать строку Json в XML или какой-либо другой формат, чтобы сделать выбор. Также я не хочу писать код для его разбора.

каков синтаксис ? Как Я выбираю все EmpId of employees здесь Name=”Name1”?

Edit1: можно ли получить результат с помощью JObject.Select (запрос LINQ) в строке JSON (не в реальном объекте) в случае SelectToken не способен сделать это? Как насчет регулярных выражений?

2 ответов


от автора 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 может сделать?

каков синтаксис параметра Path функции SelectToken?

Я считаю, что он поддерживает только строковый путь к одному токену, например "branches[0].employees[0].name"

Как выбрать все EmpId сотрудников, где Name= "Name1"?

Я не знаю SelectToken может сделать это, и ограничения вашего вопроса исключают наиболее распространенные решения.

Я не смог найти много документации (в основном синтаксиса) относительно строка пути для передачи функции SelectToken.

документация здесь:

путь состоит из имен свойств и индексов массива, разделенных периоды. Индексы массива могут использовать квадратные или круглые скобки.