Десериализация строки JSON в объект с помощью json.net

Я создаю небольшое приложение, которое извлекает статистику из API, над которым я не властен. Строка JSON выглядит так:

{
    "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+, но я думал о том, чтобы сделать string.Replace ("[weaponName]", "weapon") в данных JSON перед их десериализацией, но я тоже не могу заставить его работать.

Буду признателен за любые советы.


person Fr3gU    schedule 18.02.2011    source источник


Ответы (1)


Что вы можете сделать, так это удалить квадратные скобки из вашего JSON, что превратит его из массива в словарь. Затем он десериализуется непосредственно в этот класс:

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

Затем вы можете делать с этим все, что захотите.

person David M    schedule 18.02.2011