LINQ查询选择(...)方法与JSON的行为不符合预期

时间:2017-03-08 16:48:56

标签: c# json linq

我已经生成了一些我想要执行查询的相当大(数百MB)的JSON文件。我是LINQ的新手,因此我对语法的选择几乎都是从教程中复制而没有完全理解。以下是我的JSON文件的简化版本:

{
    "Tropes": [{
        "TropeWork": {
            "Name": "Show 1",
            "Description": "....",
            "Tags": ["RebelliousSpirit", "HiddenDepths"],
            "Url": "Series/AlmaPirata",
            "MachineName": "AlmaPirata"
        },
        "Quote": "Quote 1",
    }, {
        "TropeWork": {
            "Name": "Show 2",
            "Description": "....",
            "Tags": ["RebelliousSpirit", "HiddenDepths"],
            "Url": "Series/AlmaPirata",
            "MachineName": "AlmaPirata"
        },
        "Quote": "Quote 2",
    }]
}

我想在每个TropeWork条目中提取“Name”的每个实例,在这种情况下返回[“Show 1”,“Show 2”]。这是我尝试使用的LINQ查询:

string json = File.ReadAllText(filename);
JObject db = JObject.Parse(json);

var result = 
    from c in db["Tropes"].SelectMany(i => i["TropeWork"])
                          .Select(i => i["Name"])
                          .Values<string>()
    group c by c
    into g
    orderby g.Key ascending
    select g.Key;

一旦到达Select(i => i["Name"])行,就会抛出此异常:

  

类型'System.InvalidOperationException'的未处理异常   发生在Newtonsoft.Json.dll

     

其他信息:无法访问子值   Newtonsoft.Json.Linq.JProperty。

当我在执行的这一点检查调试器中的i时,JToken是{"Name": "Show 1"}。这让我认为数据应该可以从这里提取,但Select(i => i["Name"])似乎是错误的(显然是)。检查员还会显示属性i.Name = "Name"i.Value = "Show 1",但我的代码中都无法访问这些属性。这似乎是一个简单的修复,但我对LINQ的严格限制使我无法理解我做错了什么。

0 个答案:

没有答案