2016-04-28 16 views
-1

我试图将json(这里是指向它的链接http://antica.e-sim.org/apiFights.html?battleId=3139&roundId=1)反序列化为对象列表。将json反序列化为对象列表 - 无法创建并填充列表类型

这是我的课:

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()); 

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

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

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

我该怎么做?

+0

@PaulAbbott - 它可能是重复的,但答案已过时。自从问到问题时,我添加了一个反映Json.NET变化的答案。 – dbc

回答

5

问题是,json.net不知道如何将数据添加到您的战斗类。有几个方法来解决这个问题:

  1. 反序列化的数据列表:

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

  2. 无需实现IEnumerable的,实现你的战场类ICollection<RootObject>,然后JsonConvert将正确填充它附带数据:

    public class Battles: ICollection<RootObject>