我已经生成了一些我想要执行查询的相当大(数百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的严格限制使我无法理解我做错了什么。