使用动态密钥

时间:2015-06-13 20:05:55

标签: c# json parsing google-calendar-api

我正在尝试解析我使用c#从他们的Rest API获取的Google日历回复,但我似乎一直陷入困境。 [已编辑]更新,@符号并未阻止向下钻取,我通过将@替换为_at_进行了验证。查看快速手表的屏幕截图: enter image description here

我确定我错误地访问了这个...

这是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键(基于我发送的内容是动态的)来循环所有忙碌时间。

想法?

enter image description here

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

我过去曾处理过类似的问题,但我的问题是连字符,我只是用下划线代替连字符。您可能会做类似的事情但是看到它是一个电子邮件地址,修改架构可能会更好(正则表达式看到您从第三方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");