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.
документация здесь:
путь состоит из имен свойств и индексов массива, разделенных периоды. Индексы массива могут использовать квадратные или круглые скобки.