Как преобразовать строку в Newtonsoft.Json.Linq.JObject

Я все еще новичок и изучаю некоторые вызовы API. Просто не знаю, почему код не преобразуется из строки в Newtonsoft.Json.Linq.JObject.

WebRequest request = WebRequest.Create("https://api.pandascore.co/lol/champions?filter[name]=Brand&token==mytoken");
WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader reader = new StreamReader(stream);
string responseFromServer = reader.ReadToEnd();

JObject parsedString = JObject.Parse(responseFromServer);

Champions champion = parsedString.ToObject<Champions>();

return View(champion);

а в режиме отладки responseFromServer представляет собой строку и результат выглядит нормально, но он не преобразуется в объект. проанализированная строка = ноль.

Newtonsoft.Json.JsonReaderException: „Error reading JObject from JsonReader. Current JsonReader item is not an object: StartArray. Path

Класс чемпионов выглядит так:

public class Champions
    {
        public List<string> videogame_versions { get; set; }
        public double spellblockperlevel { get; set; }
        public double spellblock { get; set; }
        public string name { get; set; }
        public double mpregenperlevel { get; set; }
        public double mpregen { get; set; }
        public double mpperlevel { get; set; }
        public double mp { get; set; }
        public double movespeed { get; set; }
        public string image_url { get; set; }
        public int id { get; set; }
        public double hpregenperlevel { get; set; }
        public double hpregen { get; set; }
        public double hpperlevel { get; set; }
        public double hp { get; set; }
        public double critperlevel { get; set; }
        public double crit { get; set; }
        public string big_image_url { get; set; }
        public double attackspeedperlevel { get; set; }
        public object attackspeedoffset { get; set; }
        public double attackrange { get; set; }
        public double attackdamageperlevel { get; set; }
        public double attackdamage { get; set; }
        public double armorperlevel { get; set; }
        public double armor { get; set; }
    }
}

моя строка JSON выглядит так:

[
    {
        "videogame_versions": [
            "9.10.1",
            "9.9.1",
            "9.8.1",
            "9.7.2",
            "9.7.1",
            "9.6.1",
            "9.5.1",
            "9.4.1",
            "9.3.1",
            "9.2.1",
            "9.1.1",
            "8.24.1",
            "8.23.1",
            "8.22.1"
        ],
        "spellblockperlevel": 0.5,
        "spellblock": 30,
        "name": "Brand",
        "mpregenperlevel": 0.6,
        "mpregen": 10.665,
        "mpperlevel": 21,
        "mp": 469,
        "movespeed": 340,
        "image_url": "https://cdn.pandascore.co/images/lol/champion/image/7aa667709a7ce82e45c459e3df2d160a.png",
        "id": 2347,
        "hpregenperlevel": 0.55,
        "hpregen": 5.5,
        "hpperlevel": 88,
        "hp": 519.68,
        "critperlevel": 0,
        "crit": 0,
        "big_image_url": "https://cdn.pandascore.co/images/lol/champion/big_image/8ba7fd90e7c250b2dcc3183205ad6d94.jpg",
        "attackspeedperlevel": 1.36,
        "attackspeedoffset": null,
        "attackrange": 550,
        "attackdamageperlevel": 3,
        "attackdamage": 57.04,
        "armorperlevel": 3.5,
        "armor": 21.88
    }
]

предлагает 6 королевств и сломанное колесо в помощь

Как выглядит ваша строка JSON?

Rahul Sharma 22.05.2019 10:43

используйте json2csharp.com для получения класса - затем просто используйте newtonsoft.com/json/help/html/… и получите объект. В чем смысл parsedString?

Leszek P 22.05.2019 10:45

В соответствии с ошибкой говорится, что вы пытаетесь разобрать array(то есть [{key:value},{key:value}]) на object(то есть {key:value}).

vikscool 22.05.2019 10:46

@Wiskuxgodx добавьте свой ответ json.

A.M. Patel 22.05.2019 10:48

@LeszekP, да, я использовал это, и в результате получились чемпионы класса.

Wiskuxgodx 22.05.2019 10:49

@RahulSharma я обновил тему с вашим вопросом

Wiskuxgodx 22.05.2019 10:54

Это JsonArray использование чего-то вроде:List<Champions> _champions = JsonConvert.DeserializeObject<List<Champions>>(<yourJsonstri‌​ng>) ;

vikscool 22.05.2019 10:57

как указал @vikscool, вам нужно десериализовать список чемпионов, а не отдельный объект. Структура Json говорит, что это список чемпионов.

Leszek P 22.05.2019 10:57
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
9
2 528
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Хитрость здесь заключается в том, чтобы преобразовать deserialize в List<Champions>, поскольку ваши данные JSON корневого уровня представляют собой массив.

public static class Program
{
    private static void Main(string[] args)
    {
        string data = @"
            [
                    {
                        'videogame_versions': [
                            '9.10.1',
                            '9.9.1',
                            '9.8.1',
                            '9.7.2',
                            '9.7.1',
                            '9.6.1',
                            '9.5.1',
                            '9.4.1',
                            '9.3.1',
                            '9.2.1',
                            '9.1.1',
                            '8.24.1',
                            '8.23.1',
                            '8.22.1'
                        ],
                        'spellblockperlevel': 0.5,
                        'spellblock': 30,
                        'name': 'Brand',
                        'mpregenperlevel': 0.6,
                        'mpregen': 10.665,
                        'mpperlevel': 21,
                        'mp': 469,
                        'movespeed': 340,
                        'image_url': 'https://cdn.pandascore.co/images/lol/champion/image/7aa667709a7ce82e45c459e3df2d160a.png',
                        'id': 2347,
                        'hpregenperlevel': 0.55,
                        'hpregen': 5.5,
                        'hpperlevel': 88,
                        'hp': 519.68,
                        'critperlevel': 0,
                        'crit': 0,
                        'big_image_url': 'https://cdn.pandascore.co/images/lol/champion/big_image/8ba7fd90e7c250b2dcc3183205ad6d94.jpg',
                        'attackspeedperlevel': 1.36,
                        'attackspeedoffset': null,
                        'attackrange': 550,
                        'attackdamageperlevel': 3,
                        'attackdamage': 57.04,
                        'armorperlevel': 3.5,
                        'armor': 21.88
                    }
                ]
        ";

        List<Champions> champions = JsonConvert.DeserializeObject<List<Champions>>(data);
    }

    public class Champions
    {
        public List<string> videogame_versions { get; set; }
        public double spellblockperlevel { get; set; }
        public double spellblock { get; set; }
        public string name { get; set; }
        public double mpregenperlevel { get; set; }
        public double mpregen { get; set; }
        public double mpperlevel { get; set; }
        public double mp { get; set; }
        public double movespeed { get; set; }
        public string image_url { get; set; }
        public int id { get; set; }
        public double hpregenperlevel { get; set; }
        public double hpregen { get; set; }
        public double hpperlevel { get; set; }
        public double hp { get; set; }
        public double critperlevel { get; set; }
        public double crit { get; set; }
        public string big_image_url { get; set; }
        public double attackspeedperlevel { get; set; }
        public object attackspeedoffset { get; set; }
        public double attackrange { get; set; }
        public double attackdamageperlevel { get; set; }
        public double attackdamage { get; set; }
        public double armorperlevel { get; set; }
        public double armor { get; set; }
    }
}

enter image description here

JObject представляет объект JSON, известный как { /*key value pairs*/ }, и на самом деле он должен быть JArray

Если вы не хотите указывать объект JSON или массив JSON, вы можете вместо этого использовать JToken.

Если ваш json в массиве, вам необходимо преобразовать объект списка

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            var json = @"[
                        {
                            'videogame_versions': [
                                '9.10.1',
                                '9.9.1',
                                '9.8.1',
                                '9.7.2',
                                '9.7.1',
                                '9.6.1',
                                '9.5.1',
                                '9.4.1',
                                '9.3.1',
                                '9.2.1',
                                '9.1.1',
                                '8.24.1',
                                '8.23.1',
                                '8.22.1'
                            ],
                            'spellblockperlevel': 0.5,
                            'spellblock': 30,
                            'name': 'Brand',
                            'mpregenperlevel': 0.6,
                            'mpregen': 10.665,
                            'mpperlevel': 21,
                            'mp': 469,
                            'movespeed': 340,
                            'image_url': 'https://cdn.pandascore.co/images/lol/champion/image/7aa667709a7ce82e45c459e3df2d160a.png',
                            'id': 2347,
                            'hpregenperlevel': 0.55,
                            'hpregen': 5.5,
                            'hpperlevel': 88,
                            'hp': 519.68,
                            'critperlevel': 0,
                            'crit': 0,
                            'big_image_url': 'https://cdn.pandascore.co/images/lol/champion/big_image/8ba7fd90e7c250b2dcc3183205ad6d94.jpg',
                            'attackspeedperlevel': 1.36,
                            'attackspeedoffset': null,
                            'attackrange': 550,
                            'attackdamageperlevel': 3,
                            'attackdamage': 57.04,
                            'armorperlevel': 3.5,
                            'armor': 21.88
                           }
                        ]";

            List<Champions> champions = JsonConvert.DeserializeObject<List<Champions>>(json);
        }       
    }

Другие вопросы по теме