如何使用Newtonsoft.json将JSON字符串正确解析为C#中的对象?

时间:2016-05-23 07:00:54

标签: c# json

我正在创建一个小系统让我看看Twitch使用他们的JSON API在我的聊天中。但是,当我成功获取信息时,我无法弄清楚如何正确解析它。

这是正在生成的字符串:

{
  "_links": {},
  "chatter_count": 1,
  "chatters": {
    "moderators": [
      "teonnyn"
    ],
    "staff": [],
    "admins": [],
    "global_mods": [],
    "viewers": []
  }
}

这是我创建的反序列化对象,但我不确定它是否完全正确:

public class users
{
    public string[] links;
    public int chatter_count;
    public string[] moderators;
    public string[] staff;
    public string[] admins;
    public string[] global_mods;
    public string[] viewers;
}

我正在使用Newtonsoft.JSON来解析它 - 这是将字符串推送到“users”对象的正确方法吗?

1 个答案:

答案 0 :(得分:4)

不,您拥有的C#类与JSON没有正确关联:

  1. 您的links成员与JSON中的名称_links不匹配。
  2. _links被定义为一个数组,但应该是一个对象 - 它是JSON中的{},而不是[]
  3. 同样chatters,也应该是自定义类。
  4. 从Visual Studio 2013 Update 2开始,您可以从JSON示例生成C#类。这是它为您的JSON生成的内容:

    public class Rootobject
    {
        public _Links _links { get; set; }
        public int chatter_count { get; set; }
        public Chatters chatters { get; set; }
    }
    
    public class _Links
    {
    }
    
    public class Chatters
    {
        public string[] moderators { get; set; }
        public object[] staff { get; set; }
        public object[] admins { get; set; }
        public object[] global_mods { get; set; }
        public object[] viewers { get; set; }
    }
    

    正如您所看到的,它会将moderators正确地映射到string[],但会有点混淆,其余部分会使用object[],因为该片段包含数据以使其基于输入。

    如果您可以获得包含更多数据的JSON示例 - 理想情况下,每个字段都存在且具有代表性数据 - 您将获得最佳映射。

    此外,您应该将Rootobject更改为您自己的班级名称。 UserTwitchUser应该这样做。

    一旦你有一个与你的JSON正确对应的类,使用JSON.NET解析它非常简单:

    Rootobject yourData = JsonConvert.DeserializeObject<Rootobject>(inputJsonString);
    

    你已经完成了。