C# 如何在C中使用LINQ转换JSON字符串
我试图从下面的JSON访问一些键/值:C# 如何在C中使用LINQ转换JSON字符串,c#,linq,json.net,C#,Linq,Json.net,我试图从下面的JSON访问一些键/值: { "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#Collection(microsoft.graph.scheduleInformation)", "value": [ { "scheduleId": "xxxx@yyy.com", "availabilityView": "0000000000200022", "sche
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#Collection(microsoft.graph.scheduleInformation)",
"value": [
{
"scheduleId": "xxxx@yyy.com",
"availabilityView": "0000000000200022",
"scheduleItems": [
{
"isPrivate": false,
"status": "busy",
"subject": "test",
"location": "Réunion Microsoft Teams",
"start": {
"dateTime": "2020-01-29T15:00:00.0000000",
"timeZone": "Romance Standard Time"
},
"end": {
"dateTime": "2020-01-29T15:30:00.0000000",
"timeZone": "Romance Standard Time"
}
},
{
"isPrivate": false,
"status": "busy",
"subject": "HG ",
"location": "fgfg",
"start": {
"dateTime": "2020-01-29T17:00:00.0000000",
"timeZone": "Romance Standard Time"
},
"end": {
"dateTime": "2020-01-29T18:00:00.0000000",
"timeZone": "Romance Standard Time"
}
}
]
}
]
}
我想检索开始子项和结束子项的日期时间。
为此,我在WPF程序中使用了少量LINQ代码:
JObjeretrict gS = JObject.Parse(JSON);
var result = from s in gS["value"]["scheduleItems"]
orderby s["start"]["dateTime"]
select new
{
startTime = (DateTime)s["start"]["dateTime"],
endTime = (DateTime)s["end"]["dateTime"]
};
但它失败了,错误如下:
System.ArgumentException: Accessed JArray values with invalid key value: "scheduleItems". Int32 array index expected.
我已经使用以下LINQ to JSON处理了另一个JSON文件:
var rFMT = from m in fMT["meetingTimeSuggestions"]
orderby m["meetingTimeSlot"]["start"]["dateTime"]
select (DateTime)m["meetingTimeSlot"]["start"]["dateTime"];
以上,仅对startdateTime感兴趣。
没关系
救命啊 首先,为什么JSON字符串的数组中只有一个元素作为值键?您可以删除值键的方括号[],代码应该可以运行 如果您使用的是静态类型语言,我认为最好创建嵌套类并使用它们反序列化JSON字符串。但作为代码的替代方案,如果您只想使用一次,而忽略性能问题,这样的代码应该适合您:
// JSON: your json string value
var result = (JsonConvert.DeserializeObject<dynamic>(JSON)
.value[0].scheduleItems as IEnumerable<dynamic>)
.Select(x => new {
start = (DateTime)x.start.dateTime,
end = (DateTime)x.end.dateTime
});
首先,为什么JSON字符串的数组中只有一个元素作为值键?您可以删除值键的方括号[],代码应该可以运行 如果您使用的是静态类型语言,我认为最好创建嵌套类并使用它们反序列化JSON字符串。但作为代码的替代方案,如果您只想使用一次,而忽略性能问题,这样的代码应该适合您:
// JSON: your json string value
var result = (JsonConvert.DeserializeObject<dynamic>(JSON)
.value[0].scheduleItems as IEnumerable<dynamic>)
.Select(x => new {
start = (DateTime)x.start.dateTime,
end = (DateTime)x.end.dateTime
});
我想我已经发现哪里出了问题
"value":[...]
是一个数组,因此您可以访问所有数组项(在本例中只有一个),或者在查询中指定值项(在本例中为[value][0]
我不确定值是否需要是数组。尽管如此,这种方法现在仍然有效:
var result = from s in gS["value"][0]["scheduleItems"]
orderby s["start"]["dateTime"]
select new
{
startTime = (DateTime)s["start"]["dateTime"],
endTime = (DateTime)s["end"]["dateTime"]
};
我想我已经发现哪里出了问题
"value":[...]
是一个数组,因此您可以访问所有数组项(在本例中只有一个),或者在查询中指定值项(在本例中为[value][0]
我不确定值是否需要是数组。尽管如此,这种方法现在仍然有效:
var result = from s in gS["value"][0]["scheduleItems"]
orderby s["start"]["dateTime"]
select new
{
startTime = (DateTime)s["start"]["dateTime"],
endTime = (DateTime)s["end"]["dateTime"]
};
value似乎是一个数组,所以您需要执行gS[value][0][scheduleItems],正如错误所说,它需要一个整数值,而不是字符串。value似乎是一个数组,所以您需要执行gS[value][0][scheduleItems],正如错误所说,它需要一个整数值,而不是字符串。我没有选择数组作为值键。这是一个MS graph API的答案。有嵌套类的示例吗?我没有值键数组的选择。这是一个MS graph API的答案。有嵌套类的示例吗?