Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用LINQ按键名过滤JSON_Json_Linq_Jsonpath - Fatal编程技术网

使用LINQ按键名过滤JSON

使用LINQ按键名过滤JSON,json,linq,jsonpath,Json,Linq,Jsonpath,给定以下JSON: { "items": { "primary": "structured", "item0": { "keyA1": "value1", "keyA2": "value2", "keyA3": "value3" }, "item1": { "keyB1": "value1", "keyB2

给定以下JSON:

{
    "items": {
        "primary": "structured",
        "item0": {
            "keyA1": "value1",
            "keyA2": "value2",
            "keyA3": "value3"
        },
        "item1": {
            "keyB1": "value1",
            "keyB2": "value2",
            "keyB3": "value3"
        },
        "item2": {
            "keyC1": "value1",
            "keyC2": "value2",
            "keyC3": "value3"
        }
    }
}

是否可以只获取键以“item”开头的对象,即“item0”、“item1”和“item2”?最好使用Json.NET和/或LINQ,但JSONPath表达式也可以(我尝试在JSONPath表达式中使用星号来匹配
项*
,但没有效果)。

当然,可以使用Json.NET的:

var items=JObject.Parse(json)[“items”]
.儿童()
.Where(jp=>jp.Name.StartsWith(“项目”))
.Select(jp=>(JObject)jp.Value)
.ToList();
foreach(项目中的var项目)
{
foreach(项目中的var kvp)
{
Console.WriteLine(kvp.Key+“:”+kvp.Value);
}
Console.WriteLine();
}

Fiddle:

我假设您不想要“items”对象(因为它也以“item”开头)。这正是我需要的!谢谢有没有一种使用
.SelectTokens()
+JSONPath的较短方法?据我所知,没有。我看不到一种使用JSONPath在密钥名上执行“StartsWith”的方法。
var items = JObject.Parse(json)["items"]
                   .Children<JProperty>()
                   .Where(jp => jp.Name.StartsWith("item"))
                   .Select(jp => (JObject)jp.Value)
                   .ToList();

foreach (var item in items)
{
    foreach (var kvp in item)
    {
        Console.WriteLine(kvp.Key + ": " + kvp.Value);
    }
    Console.WriteLine();
}