Я вытаскиваю JSON из API. Он поставляется в таком формате:
{"yourname": {
"id": 42728521,
"name": "Your Name",
"profileIconId": 27,
"revisionDate": 1397930999000,
"summonerLevel": 1
}}
Однако это сохраняется как:
"{\"yourname\":{\"id\":42728521,\"name\":\"Your Name\",\"profileIconId\":27,\"summonerLevel\":1,\"revisionDate\":1397930999000}}"
Внутри строки.
Я хочу иметь возможность вызвать summonerLevel и вернуть ему правильное значение.
Я пытался это сделать:
using (var client = new WebClient())
{
api_return = client.DownloadString(api_call_key);
}
var foo = JsonConvert.DeserializeObject<Summoner>(api_return);
Console.WriteLine(Summoner.id);
Console.WriteLine(Summoner.name);
Console.WriteLine(Summoner.summonerLevel);
string id_ = foo.ToString();
Console.WriteLine(id_);
Console.ReadKey();
}
public class Summoner
{
public static int id { get; set; }
public static string name { get; set; }
public static int summonerLevel { get; set; }
}
Однако это просто печатает:
0 ничего 0
У вас есть два вопроса, которые препятствуют вам получать данные от JSON.
Первая проблема заключается в том, что свойства вашего класса Summoner
не должны быть static
, как отметил Викас. Определите свой класс следующим образом:
public class Summoner
{
public int id { get; set; }
public string name { get; set; }
public int summonerLevel { get; set; }
}
Вторая проблема заключается в том, что ваша структура JSON не соответствует тому, что вы десериализируете. Свойства id
, name
и summonerLevel
не находятся на корневом уровне JSON, они находятся на одном уровне ниже, внутри другого объекта. Итак, вам нужно десериализовать в какой-то класс, который "обертывает" вашего Summoner
. Если свойство yourname
в JSON было фиксированным значением, вы можете определить класс Wrapper, подобный этому, для десериализации:
public class Wrapper
{
[JsonProperty("yourname")]
public Summoner Summoner { get; set; }
}
Однако, поскольку свойство yourname
в JSON, скорее всего, не является фиксированным значением (оно может измениться для разных вызывающих), я рекомендовал бы десериализацию в Dictionary<string, Summoner>
как это:
var dict = JsonConvert.DeserializeObject<Dictionary<string, Summoner>>(json);
Оттуда вы можете либо пройти через пары слова-словаря слова, либо, если вы их только ожидаете, вы можете использовать First()
для его получения.
var summoner = dict.First().Value;
Вот полная демоверсия:
string json = @"{""yourname"": {
""id"": 42728521,
""name"": ""Your Name"",
""profileIconId"": 27,
""revisionDate"": 1397930999000,
""summonerLevel"": 1
}}";
var dict = JsonConvert.DeserializeObject<Dictionary<string, Summoner>>(json);
var summoner = dict.First().Value;
Console.WriteLine(summoner.id);
Console.WriteLine(summoner.name);
Console.WriteLine(summoner.summonerLevel);
Вывод:
42728521
Your Name
1
Свойства в классе Summoner
не должны быть static
using (var client = new WebClient())
{
api_return = client.DownloadString(api_call_key);
}
var foo = JsonConvert.DeserializeObject<Summoner>(api_return);
Console.WriteLine(foo.id);
Console.WriteLine(foo.name);
Console.WriteLine(foo.summonerLevel);
..............
}
public class Summoner
{
public int id { get; set; }
public string name { get; set; }
public int summonerLevel { get; set; }
}
JsonProperty
.
foo
, используйте его для доступа к значениям.