Я получаю сообщение об ошибке десериализации объекта json

#c# #.net

#c# #.net

Вопрос:

Я получаю нули, десериализующие объект. Попытался удалить это ключевое слово List, но затем я получаю нули. Ошибка-

 Cannot deserialize the current JSON object
 

`

Может быть, у вас есть какие-нибудь идеи, как это исправить. 🙂

Код:

             client.BaseAddress = new Uri("https://euw1.api.riotgames.com/lol/match/v4/matchlists/by-account/");
            string s = client.GetStringAsync("SRAUZPYTqglRgTjMEzaqY1s-wFMaNZnCjgBHMqQNDnJeJNw?endIndex=10amp;api_key=RGAPI-7bc6b22c-3ce3-41e6-bfbd-90b1eccb212f").Resu<
            var rankInfoList = JsonConvert.DeserializeObject<List<MatchInfo>>(s);
 

Модель:

 public class MatchInfo
    {
       
        public string gameId { get; set; }
        public string champion { get; set; }
    }
 

Json:

 {
    "matches": [
        {
            "platformId": "EUW1",
            "gameId": 4961339963,
            "champion": 1,
            "queue": 420,
            "season": 13,
            "timestamp": 1607031715226,
            "role": "SOLO",
            "lane": "MID"
        },
        {
            "platformId": "EUW1",
            "gameId": 4961185949,
            "champion": 238,
            "queue": 420,
            "season": 13,
            "timestamp": 1607026682284,
            "role": "SOLO",
            "lane": "MID"
        }
    ],
    "startIndex": 0,
    "endIndex": 2,
    "totalGames": 120
}
 

Ответ №1:

Вам нужно создать RootObject, который будет иметь matches свойство. тогда совпадения будут представлять собой список объектов ( MatchInfo )

Ваш RootObject будет выглядеть следующим образом,

 public class RootObject
{
    public List<MatchInfo> matches { get; set; }
    public int startIndex { get; set; }
    public int endIndex { get; set; }
    public int totalGames { get; set; }
}

public class MatchInfo
{
    public string platformId { get; set; }
    public long gameId { get; set; }
    public int champion { get; set; }
    public int queue { get; set; }
    public int season { get; set; }
    public long timestamp { get; set; }
    public string role { get; set; }
    public string lane { get; set; }
}
 

Затем вы выполните десериализацию, используя следующий оператор

 var rankInfoList = JsonConvert.DeserializeObject<RootObject>(s);
 

Ответ №2:

Потому что JSON не соответствует модели. Модель, в которую вы пытаетесь ее десериализовать, является a List<MatchInfo> , но JSON — это не список, это объект со свойством, которое содержит список. Создайте содержащую модель:

 public class MatchInfos
{
    public List<MatchInfo> matches { get; set; }
}
 

И десериализуйте в это:

 var rankInfoList = JsonConvert.DeserializeObject<MatchInfos>(s);
 

Ответ №3:

matches — это коллекция (MatchInfo), но вы обрабатываете корень как коллекцию. Вместо этого попробуйте сделать это так:

 void Main()
{
    string json = @"{
        ""matches"": [
            {
                ""platformId"": ""EUW1"",
                ""gameId"": 4961339963,
                ""champion"": 1,
                ""queue"": 420,
                ""season"": 13,
                ""timestamp"": 1607031715226,
                ""role"": ""SOLO"",
                ""lane"": ""MID""
            },
            {
                ""platformId"": ""EUW1"",
                ""gameId"": 4961185949,
                ""champion"": 238,
                ""queue"": 420,
                ""season"": 13,
                ""timestamp"": 1607026682284,
                ""role"": ""SOLO"",
                ""lane"": ""MID""
            }
        ],
        ""startIndex"": 0,
        ""endIndex"": 2,
        ""totalGames"": 120
    }";


    var data = JsonConvert.DeserializeAnonymousType(json, new { matches = new[] { new MatchInfo {}}});
    // data.matches is your MatchInfo list.
}

public class MatchInfo
{
    public string gameId { get; set; }
    public string champion { get; set; }
}