Сохраните строку JSON в C #, а затем получите доступ к отдельным ее частям.

1

Я вытаскиваю 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

  • 0
    Взгляни на это
  • 0
    Вы храните десериализованный объект внутри переменной foo , используйте его для доступа к значениям.
Показать ещё 1 комментарий
Теги:
json.net

2 ответа

2

У вас есть два вопроса, которые препятствуют вам получать данные от 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
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; }
}
  • 0
    Это печатает 0 пустых 0
  • 0
    Украсьте свойства атрибутом JsonProperty .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню