【问题标题】:Deserializing json into a list of objects - Cannot create and populate list type [duplicate]将json反序列化为对象列表-无法创建和填充列表类型[重复]
【发布时间】:2016-08-23 22:30:30
【问题描述】:

我正在尝试将 json(这里是指向它的链接 http://antica.e-sim.org/apiFights.html?battleId=3139&roundId=1)反序列化为对象列表。

这是我的课:

public class RootObject
    {
        public int Damage { get; set; }
        public int Weapon { get; set; }
        public bool Berserk { get; set; }
        public bool DefenderSide { get; set; }
        public double MilitaryUnitBonus { get; set; }
        public int Citizenship { get; set; }
        public int CitizenId { get; set; }
        public bool LocalizationBonus { get; set; }
        public string Time { get; set; }
        public int MilitaryUnit { get; set; }
    }

    public class Battles: IEnumerable<RootObject>
    {
        public IEnumerable<RootObject> battles { get; set; }
        public IEnumerator<RootObject> GetEnumerator()
        {
            return battles.GetEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return battles.GetEnumerator();
        }
    }

这就是我获取 json 并尝试反序列化它的方式:

string url = "http://" + serverEsim + ".e-sim.org/apiFights.html?battleId=" +
                                     battles.ElementAt(k).Key + "&roundId=" + i;
                        WebRequest req = WebRequest.Create(url);
                        WebResponse resp = req.GetResponse();
                        StreamReader jsr = new StreamReader(resp.GetResponseStream());
                        Battles battle = JsonConvert.DeserializeObject<Battles>(jsr.ReadToEnd());

当我尝试解散时,它给了我一个例外:

未处理的类型异常 'Newtonsoft.Json.JsonSerializationException' 发生在 Newtonsoft.Json.dll

附加信息:无法创建和填充列表类型 项目。战斗。路径'',第 3 行,位置 1。

我做错了什么?

【问题讨论】:

  • @PaulAbbott - 它可能是重复的,但该答案已过时。我添加了一个答案,反映了 Json.NET 的变化,因为它被问到了。

标签: c# json json.net


【解决方案1】:

问题是 json.net 不知道如何将数据添加到您的 Battles 类。有几种方法可以解决这个问题:

  1. 将数据反序列化为列表:

    JsonConvert.DeserializeObject&lt;List&lt;RootObject&gt;&gt;(jsr.ReadToEnd());

  2. 不要实现IEnumerable,而是在你的Battles类中实现ICollection&lt;RootObject&gt;,然后JsonConvert会用数据正确地填充它:

    public class Battles: ICollection&lt;RootObject&gt;

【讨论】:

  • Alexander - 这在尝试通过 vba 使用 CCW dll 时节省了我的培根...我的自定义集合类从 IEnumerable 到 ICollection 的热交换成功了!赞赏
  • 非常有用的建议是在使用 JsonPatch 时从 ICollection 继承而不是 IEnumerable
猜你喜欢
  • 1970-01-01
  • 2022-12-13
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
相关资源
最近更新 更多