在 JArray 中使用 LINQ

Posted

技术标签:

【中文标题】在 JArray 中使用 LINQ【英文标题】:Using LINQ in JArray 【发布时间】:2021-06-01 09:30:14 【问题描述】:

我有一个 JSON


  "departments": [
    
      "2": "city": "Petersburg", "employees": "1200"
    ,
    
      "1": "city": "Ekaterinburg", "employees": "4000"
    
  ]

如果我知道使用 LINQ 或其他方法的 ID,我如何获得城市的价值?

我试过了

var id = 2;
json["departments"].Single(x=>x.Name==id.ToString())["city"];

但它不起作用,我得到一个编译错误:

'JToken' does not contain a definition for 'Name' and no accessible extension method 'Name' accepting a first argument of type 'JToken' could be found (are you missing a using directive or an assembly reference?)

演示小提琴here.

【问题讨论】:

【参考方案1】:

您的 LINQ 查询可以按如下方式实现:

var id = "2";
var city = (string)json["departments"]
    .Where(o => o[id] != null) // From the departments array, select the object where the required id property exists
    .Select(o => o[id]["city"]).SingleOrDefault(); // An extract the value of "city" from the nested object.

或者,等效地:

var id = "2";
var city = (string)json["departments"]
    .SelectMany(i => i) // Use SelectMany() to project the properties of the array items to a flat enumerable 
    .Cast<JProperty>()  // Cast them to JProperty
    .Where(p => p.Name == id) // Now you can use Name
    .Select(p => p.Value["city"])
    .SingleOrDefault();

或者,您也可以为此使用SelectToken()

var id = "2";
var path = $"departments[*].id.city"; // departments[*].2.city
var city = (string)json.SelectToken(path);

SelectToken() 支持JSONPath syntax,[*] 是 JSONPath 通配符,表示应该搜索所有数组项。

演示小提琴here.

【讨论】:

以上是关于在 JArray 中使用 LINQ的主要内容,如果未能解决你的问题,请参考以下文章

如何在不添加新 JObject 键/名称的情况下将 JArray 添加到 JObject 中?

C# 在单个对象中反序列化两个 Jarray 对象

c#如何把json值转化成jarray

如何正确地将 JArray 解析为字符串集合

C# JArray与JObject 的使用

从jarray中删除指定元素的问题