Json.NET LINQ 查询 在 JObjects 的 JArray 上对单个 JProperty 进行查询



我有一个具有此配置的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 小提琴。

相关内容

  • 没有找到相关文章

最新更新