2011-02-18 16 views
5

Estoy construyendo una pequeña aplicación que extrae estadísticas de una API sobre la que no tengo control. El cadena JSON se ve así:Deserializando cadena JSON a Object con 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 
        }, 
      } 
     ] 
} 

y mis objetos están configurados de la siguiente manera:

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; } 
} 

que no tienen ningún problema deserializar la cadena de la forma en que está configurado ahora, es decir, puedo hacer:

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

Esto da salida a AEK-971 Vintovka

Bien ... pero no quiero las diferentes armas como propiedades separadas. Quiero ser capaz de enumerar y hacer un foreach en cada arma o algo así:

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

Algún consejo de cómo lograr esto?

La lista de armas reales es 60+ pero he estado pensando en hacer una cadena. Reemplazar ("[weaponName]", "weapon") en los datos JSON antes de deserializarlos, pero no puedo hacerlo funcionar ya sea.

Agradecería cualquier consejo.

Respuesta

3

Lo que podría hacer es eliminar los corchetes de su JSON, que lo convierte de una matriz a un diccionario. Esto se deserializará directamente en esta clase:

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

Puede hacer lo que quiera con eso.

+0

Gracias David. ¡Funciona a las mil maravillas! – Fr3gU

Cuestiones relacionadas