C# 如何在C中使用LINQ转换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

我试图从下面的JSON访问一些键/值:

{
"@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的答案。有嵌套类的示例吗?