将json反序列化为对象列表 - 无法创建和填充列表类型

Gar*_*tar 1 c# json json.net

我正在尝试将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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是我如何获取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());
Run Code Online (Sandbox Code Playgroud)

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

Newtonsoft.Json.dll中发生未处理的"Newtonsoft.Json.JsonSerializationException"类型异常

附加信息:无法创建和填充列表类型Project.Battles.路径'',第3行,第1位.

我做错了什么?

小智 10

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

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

    JsonConvert.DeserializeObject<List<RootObject>>(jsr.ReadToEnd());

  2. 而不是在您的Battles类中实现IEnumerable,实现ICollection<RootObject>,然后JsonConvert将使用数据正确填充它:

    public class Battles: ICollection<RootObject>

  • 非常有用的建议在使用 JsonPatch 时继承“ICollection”而不是“IEnumerable” (2认同)