2011-02-18 133 views
5

我正在构建一个小型应用程序,它从我无法控制的API抽取统计信息。 JSON字符串看起来是这样的:将json字符串反序列化为json.net对象

{ 
    "weapons": 
     [ 
      { 
       "aek": 
        { 
         "name":"AEK-971 Vintovka", 
         "kills":47, 
         "shots_fired":5406, 
         "shots_hit":858 
        }, 
       "xm8": 
        { 
         "name":"XM8 Prototype", 
         "kills":133, 
         "shots_fired":10170, 
         "shots_hit":1790 
        }, 
      } 
     ] 
} 

和我对象被设置如下:

class WeapsCollection 
{ 
    public WeaponList[] Weapons { get; set; } 
} 

class WeaponList 
{ 
    public WeaponDetails AEK { get; set; } 
    public WeaponDetails XM8 { get; set; } 
} 

class WeaponDetails 
{ 
    public string Name { get; set; } 
    public int Kills { get; set; } 
    public int Shots_Fired { get; set; } 
    public int Shots_Hit { get; set; } 
} 

我没有反序列化的字符串时,它被设置现在的方式,即任何问题我可以这样做:

WeapsCollection weps = JsonConvert.DeserializeObject<WeapsCollection>(json); 
Console.WriteLine(weps.Weapons.First().AEK.Name.ToString()); 
Console.ReadLine(); 

此输出AEK-971 Vintovka

很好...但我不希望不同的武器作为单独的属性。我希望能够枚举,做一个foreach每个武器或者是这样的:

Console.WriteLine(weapons.Where(w => w.Kills > 30).Name.ToString()); 

任何提示,如何实现这一目标?

实际的武器列表是60+,但我一直在考虑在对它进行反序列化之前对JSON数据做一个字符串。替换(“[weaponName]”,“武器”),但我无法让它工作无论是。

我会很感激任何提示。

回答

3

你可以做的是从你的JSON中删除方括号,从数组中将它转换成字典。于是,这将直接deserialise到这个类:

class WeaponList 
{ 
    public Dictionary<string, WeaponDetails> Weapons { get; set; } 
} 

然后你可以做任何你想做这一点。

+0

谢谢大卫。它像一个魅力! – Fr3gU 2011-02-18 14:21:55

相关问题