Как преобразовать строку в Newtonsoft.Json.Linq.JObject - PullRequest
0 голосов
/ 22 мая 2019

Я все еще новичок и изучаю некоторые вызовы 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 - строка, и результат выглядит нормально, но это не конвертируется в объект.parsedString = null.

Newtonsoft.Json.JsonReaderException: «Ошибка чтения JObject из JsonReader.Текущий элемент JsonReader не является объектом: StartArray.Путь

Класс чемпионов выглядит следующим образом:

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 королевств и сломанное колесо для помощи

Ответы [ 3 ]

0 голосов
/ 22 мая 2019

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

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

0 голосов
/ 22 мая 2019

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

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);
        }       
    }
0 голосов
/ 22 мая 2019

Хитрость здесь в том, чтобы 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...