Ошибка при десериализации json

297
21 августа 2017, 07:03

Пытаюсь десериализовать json в класс, но выдает ошибку "Не удается преобразовать объект типа "System.Boolean" в тип "Sell_Offers"" Хочу получить доступ к offers

var rez = new JavaScriptSerializer().Deserialize<Root>(json));

-

{
"success": true,
"results": [
    {
        "classid": "1812818783",
        "instanceid": "188530139",
        "sell_offers": {
            "best_offer": 324,
            "offers": [
                [
                    324,
                    1
                ],
                [
                    444,
                    2
                ],
                [
                    446,
                    1
                ],
                [
                    524,
                    1
                ],
                [
                    528,
                    2
                ],
                [
                    540,
                    1
                ],
                [
                    543,
                    1
                ],
                [
                    554,
                    1
                ],
                [
                    1498,
                    2
                ],
                [
                    1500,
                    1
                ]
            ],
            "my_offers": null
        },
        "buy_offers": null,
        "history": null,
        "info": {
            "our_market_instanceid": null,
            "market_name": "P250 | Iron Clad (Немного поношенное)",
            "name": "P250 | Iron Clad",
            "market_hash_name": "P250 | Iron Clad (Minimal Wear)",
            "rarity": "Армейское качество",
            "quality": "Немного поношенное",
            "type": "Пистолет",
            "mtype": "CSGO_Type_Pistol",
            "slot": "Обыч."
        }
    }

]

}

Встроенный генератор в Visual Studio дал следующий код класса

public class Root
{
    public bool success { get; set; }
    public Result[] results { get; set; }
}
public class Result
{
    public string classid { get; set; }
    public string instanceid { get; set; }
    public object sell_offers { get; set; }
    public object buy_offers { get; set; }
    public object history { get; set; }
    public Info info { get; set; }
}
public class Info
{
    public object our_market_instanceid { get; set; }
    public string market_name { get; set; }
    public string name { get; set; }
    public string market_hash_name { get; set; }
    public string rarity { get; set; }
    public string quality { get; set; }
    public string type { get; set; }
    public string mtype { get; set; }
    public string slot { get; set; }
}
Answer 1

И так, нам надо получить доступ к offers. Давайте прогоним через этот сайт ваш JSON. Что видим?

  • У нас есть некий список results, в котором каждый объект содержит в себе отдельный объект sell_offers.
  • Так, смотрим что же в самом sell_offers, а в нем у нас нужный нам список offers, который состоит из массива с последовательным отображением чисел.

Давайте все это создадим:

public class Root
{
    public Result[] results { get; set; } 
}
public class Result
{
    public SellOffers sell_offers { get; set; }
}
public class SellOffers
{
    public List<List<int>> offers { get; set; }
}

Я не стал тут выводить другие данные, это уже по аналогии думаю сделаете без проблем. Читать данные можете так же, как и делали. Я кстати советую вам использовать JSON.NET библиотеку, хорошая, удобная. Вообще я лично не доверяю конвертеру студии, больше нравится данный сайт, но это уже дело вкусов.

Хорошо, раз у нас один объект может быть то bool, то список, давайте это проверим. Переделаем public SellOffers sell_offers { get; set; } на public dynamic sell_offers { get; set; }, от класса SellOffers отказываемся и делаем следующее:

foreach (var item in rez.results)
{
    var itemType = item.sell_offers.GetType();
    if (itemType.Equals(typeof(bool))) continue; //Пропускаем все те, что имеют тип Bool
    foreach (var offer in item.sell_offers["offers"])
    {
        Console.WriteLine($"{offer[0]} - {offer[1]}");
    }
}
READ ALSO
Вставка текста в массив текстбоксов - c#

Вставка текста в массив текстбоксов - c#

Ситуация такаяЕсть массив текстбоксов tb[] (на форме их много, допустим начиная с textBox1 по textBox36)

370
mvc core передать в представление модель

mvc core передать в представление модель

Есть форма в представлении передает данные в контроллер где записываются в БДНужно вернуть в представление Id вставленного обьекта

259
Перемещение Panel если она мешает курсору

Перемещение Panel если она мешает курсору

Я думаю можно обойтись без кода, тут главное смысл1

236
Снижение скорости работы программы

Снижение скорости работы программы

Имеется парсер, написанный на c#Заметил, что при запуске скорость работы выше, чем, к примеру, через несколько часов

223