JSON Массив без имени массива в свойство - PullRequest
1 голос
/ 17 июня 2020

У меня проблема с десериализацией JSON ответов от RIOT API в C#. Я хочу получить список LeagueEntryDTO. API возвращает поток, который выглядит следующим образом:

[
{
"leagueId": "c83a16ca-b80e-4456-9f57-bc0f2a6020ae",
"queueType": "RANKED_SOLO_5x5",
"tier": "DIAMOND",
"rank": "II",
"summonerId": "XrhB60yIVT_t6Uwp0XuWRpFYD49_Ypk9ycybSdt6LS9Lv5E",
"summonerName": "MasterPrzecin",
"leaguePoints": 7,
"wins": 68,
"losses": 62,
"veteran": false,
"inactive": false,
"freshBlood": false,
"hotStreak": false},
{
"leagueId": "6b3e4e2e-cc90-4e06-afb2-7c2f4b0be9ab",
"queueType": "RANKED_FLEX_SR",
"tier": "PLATINUM",
"rank": "III",
"summonerId": "XrhB60yIVT_t6Uwp0XuWRpFYD49_Ypk9ycybSdt6LS9Lv5E",
"summonerName": "MasterPrzecin",
"leaguePoints": 58,
"wins": 7,
"losses": 7,
"veteran": false,
"inactive": false,
"freshBlood": false,
"hotStreak": false
}
]

Это мой текущий код для преобразования данных, которые не работают:

public class LeagueEntryDTOService : ILeagueEntryDTOService
{

    RestClient client = new RestClient("https://eun1.api.riotgames.com/lol/league/v4/entries/");

    public LeagueEntryDTOResponse GetLeagueEntryDTO()
    {
        var request = new RestRequest("by-summoner/{encryptedSummonerId}")
            .AddParameter("encryptedSummonerId", "XrhB60yIVT_t6Uwp0XuWRpFYD49_Ypk9ycybSdt6LS9Lv5E", ParameterType.UrlSegment)
            .AddParameter("api_key", "key");

        var response = client.Execute<LeagueEntryDTOResponse>(request);

        if (!response.IsSuccessful)
        {
            return null;
        }
        return response.Data;
    }
    public class LeagueEntryDTOResponse
    {
        public ICollection<AllRanks> Ranks { get; set; }
    }
    public class AllRanks
    {
        public string Tier { get; set; }
        public string Rank { get; set; }
        public int LeaguePoints { get; set; }
        public int Wins { get; set; }
        public int Losses { get; set; }
    }
}
}

Каков хороший способ десериализации этих данных?

1 Ответ

1 голос
/ 17 июня 2020

У вас есть список AllRanks вместо объекта, который содержит список AllRanks. Если перед массивом списка было имя свойства, то вы бы go десериализовали json из LeagueEntryDTOResponse, но в этом случае List<AllRanks> будет

Попробуйте это,

client.Execute<List<AllRanks>>(request)

Кроме того, атрибуты вашего класса должны соответствовать регистру свойств json. Вы можете либо сопоставить регистр при объявлении переменных, либо добавить [JsonProperty()], чтобы определить точное совпадение. Поскольку соглашение заключается в использовании первой буквы как UpperCase, лучше всего определить свойства JsonProperties, как показано ниже.

public class AllRanks
{
    [JsonProperty("tier")]
    public string Tier { get; set; }
    [JsonProperty("rank")]
    public string Rank { get; set; }
    [JsonProperty("leaguePoints")]
    public int LeaguePoints { get; set; }
    [JsonProperty("wins")]
    public int Wins { get; set; }
    [JsonProperty("losses")]
    public int Losses { get; set; }
}

Поскольку вы возвращаете List<AllRanks>, вам также нужно будет изменить тип возвращаемого значения метода,

public List<AllRanks> GetLeagueEntryDTO()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...