JSON.Net десериализация неуниверсальных корневых объектов

В настоящее время я работаю над проектом, в котором я делаю запрос к API Riot Games, анализирую JSON и делаю с ним некоторые вещи. У меня есть запрос работает, и я знаю, что получаю действительный JSON. Моя проблема заключается в использовании JSON.Net для десериализации JSON.

JSON имеет следующую структуру:

{
  "xarcies": {
        "id": 31933985,
        "name": "Farces",
        "profileIconId": 588,
        "revisionDate": 1450249383000,
        "summonerLevel": 30
    }
}

Я хочу загрузить эти данные в следующий класс

[JsonObject(MemberSerialization.OptIn)]
class Summoner
{
    [JsonProperty("id")]
    public long id {get;set;}

    [JsonProperty("name")]
    public string name { get; set; }

    [JsonProperty("profileIconId")]
    public int profileIconId { get; set; }

    [JsonProperty("revisionDate")]
    public long revisionDate { get; set; }

    [JsonProperty("summonerLevel")]
    public long summonerLevel { get; set; }
}

У меня проблема в том, что, поскольку я получил объект "xarcies", который содержит необходимую мне информацию, я не уверен, как разработать класс, который может принимать данные JSON. Я видел несколько примеров, которые используют класс RootObject для получения объекта, и у этого класса есть подкласс, в который помещаются все пары, но я не могу заставить его работать. Каждый раз, когда я запускаю его, атрибуты объекта оказываются пустыми.

2 ответа

Решение

Вы можете десериализовать свой JSON как Dictionary<string, Summoner>:

var root = JsonConvert.DeserializeObject<Dictionary<string, Summoner>>(jsonString);

В словарь будет вводиться имя пользователя, в этом случае "xarcies", См. Десериализация словаря.

Я просто использовал http://json2csharp.com/ для создания следующего класса (его типы немного отличаются от ваших):

public class UserData
{
    public int id { get; set; }
    public string name { get; set; }
    public int profileIconId { get; set; }
    public long revisionDate { get; set; }
    public int summonerLevel { get; set; }
}

public class RootObject
{
    public KeyValuePair<string, UserData> value { get; set; }
}
Другие вопросы по тегам