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

6
我正在尝试使用C#解析从Google Rest API获取的日历响应,但似乎一直卡住了。[编辑]更新:@符号并没有阻止深入挖掘,我通过用_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);

and

var myObj = JsonConvert.DeserializeObject(jsonString);

但我不知道如何进入动态生成的 joe@bobs.com 密钥来循环遍历所有忙碌的时间。

有什么想法吗?

enter image description here

2个回答

3
您可以通过字符串索引器访问它:
var myObj = JsonConvert.DeserializeObject<dynamic>(jsonString);
Console.WriteLine(myObj.calendars["joe@bobs.com"]);

成功了,我能够使用这种访问方法来访问属性:myObj["calendars"]["joe@bobs.com"]["busy"][0].start。谢谢! - user3491101
问题:是否有办法动态获取电子邮件地址?我目前知道它是什么,但如果未来我不知道它是什么,我该如何访问它?是否有某种子属性或类似的东西? - user3491101
1
foreach (var item in myObj["calendars"]) Console.WriteLine(item.Name)对于myObj["calendars"]中的每个项目,使用变量item并输出其名称。 - David Deutsch
1
我认为对于动态对象,如果变量名称不受限制,通常可以像属性一样使用它们而不是索引。myObj.calendars["joe@bobs.com"] - jocull

0

我曾经遇到过类似的问题,不过我的问题是连字符,我只是用下划线替换了它。你也可以尝试类似的方法,但由于这是一个电子邮件地址,最好修改模式(正则表达式),创建一个新的键“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");

谢谢Joachim,我尝试替换@符号,但它并没有帮助解决我的问题 - 请参见上面的快速查看截图。似乎是一个嵌套的Json在Json中? - user3491101

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接