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; }
}