使用动态键将 Json 解析为动态 C# 对象

Parsing Json into a dynamic c# object with a dynamic key

我正在尝试使用 c# 解析我从他们的 Rest API 获得的 Google 日历响应,但我似乎一直卡住了。 [已编辑] 更新,@ 符号不会阻止向下钻取,我通过将 @ 替换为 _at_ 进行了验证。看快看截图:

我确定我访问的有误...

这是我要解析的 jsonString

{
 "kind": "calendar#freeBusy",
 "timeMin": "2015-06-12T14:00:00.000Z",
 "timeMax": "2015-06-14T14:00:00.000Z",
 "calendars": {
  "joe@bobs.com": {
   "busy": [
    {
     "start": "2015-06-13T18:30:00Z",
     "end": "2015-06-13T19:30:00Z"
    },
    {
     "start": "2015-06-13T20:30:00Z",
     "end": "2015-06-13T21:30:00Z"
    },
    {
     "start": "2015-06-13T23:00:00Z",
     "end": "2015-06-14T00:00:00Z"
    }
   ]
  }
 }
}

我试过使用:

dynamic myObj = Json.Decode(jsonString);

var myObj = JsonConvert.DeserializeObject(jsonString);

但我不知道如何进入 joe@bobs.com 键(根据我发送的内容是动态的)来循环所有繁忙时间。

想法?

我过去处理过类似的问题,但是我的是连字符的问题,我只是用下划线替换了连字符。您可能会做类似的事情,但是看到它是一个电子邮件地址,最好修改模式(正则表达式看到您从第三方 API 收到 json)创建一个新密钥 "mail" 以便您可以确保保持原始电子邮件地址不变。

但也许更重要的是,当您查询此 API 时,您可能已经知道该电子邮件,如果是这样,您可以简单地进行正则表达式替换:

        string json = '... {"joe@bobs.com":...}...';
        Regex regex = new Regex(@"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b");
        string jsonfixed = regex.Replace(json, "email");

您可以通过字符串索引器访问它:

var myObj = JsonConvert.DeserializeObject<dynamic>(jsonString);
Console.WriteLine(myObj.calendars["joe@bobs.com"]);