我有一个具有此配置的JArray
[
{
"name" : "text",
"age" : 32
},
{
"name" : "text2",
"age" : 33
},
]
我想使用 LINQ 查询来选择一个包含 JObjects 的 JArray,其中只有指定给定键的键值。
例如:
GetCollectionOfPropertiesByKey("name");
这将导致:
[
{
"name" : "text"
},
{
"name" : "text2"
},
]
使用相同的逻辑,
GetCollectionOfPropertiesByKey("age");
将导致:
[
{
"age" : 32
},
{
"age" : 33
},
]
您没有指定是否需要按名称对属性进行大小写不变筛选,因此下面是一个带有可选 StringComparison
参数的扩展方法:
public static class JsonExtensions
{
public static JArray GetCollectionOfPropertiesByKey(this JArray array, string key, StringComparison comparison = StringComparison.Ordinal)
{
if (array == null)
return null;
var query = array
// Filter out array items that are not objects
.OfType<JObject>()
// Select the value JToken with the specified key using the specified StringComparison
.Select(o => o.GetValue(key, comparison))
// Filter for null (property was not found)
.Where(v => v != null)
// And select a new JObject containing just the JPropery parent of the selected value
.Select(v => new JObject(v.Parent));
return new JArray(query);
}
}
如果需要不区分大小写的匹配项,请传递StringComparison.OrdinalIgnoreCase
。
笔记:
- 查询筛选输入数组中类型
JObject
的所有项,然后使用JObject.GetValue(String, StringComparison)
按键名获取相应的值。 - 然后,如果找到一个值,它将使用所选值的父值构造一个新
JObject
,该值应为JProperty
。 如果从不需要不区分大小写,则可以通过使用
JObject.Property(String)
按键名获取JProperty
,然后构造包含它的JObject
来简化查询,如下所示:var query = array // Filter out array items that are not objects .OfType<JObject>() // Select the JProperty with the specified key .Select(o => o.Property(key)) // Filter for null (property was not found) .Where(p => p != null) // And select a new JObject with just this property .Select(p => new JObject(p));
示例工作 .Net 小提琴。