2016-10-16 4 views
0

Я пытаюсь понять, как вызвать API (Pokeapi) и проанализировать данные, полученные в ответе, в объект во внешней библиотеке (PokeApi.NET) на C#.Parsing JSON от Pokeapi

Я получаю ответ в своем коде на C#, но мне трудно разобрать ответ на объект.

Я считаю, что проблема связана с последней строкой кода, но я не уверен, что это должно быть?

C# код:

private static string URL = "http://pokeapi.co/api/v2/pokemon/"; 

static async void GetPokemonAsync() 
{ 
    string page = URL; 

    using (HttpClient client = new HttpClient()) 
    using (HttpResponseMessage response = await client.GetAsync(page)) 
    using (HttpContent content = response.Content) 
    { 
     string result = await content.ReadAsStringAsync(); 

     if (result != null && result.Length >= 50) 
     { 
      Console.WriteLine(result.Substring(0,200)); 
      PokeAPI.Pokemon a = JsonConvert.DeserializeObject<PokeAPI.Pokemon>(result); 
     } 
    } 
} 

пример результата:

{"count":811,"previous":null,"results":[{"url":"http:\/\/pokeapi.co\/api\/v2\/pokemon\/1\/","name":"bulbasaur"},{"url":"http:\/\/pokeapi.co\/api\/v2\/pokemon\/2\/","name":"ivysaur"},{"url":"http:\/\/pokeapi.co\/api\/v2\/pokemon\/3\/","name":"venusaur"},{"url":"http:\/\/pokeapi.co\/api\/v2\/pokemon\/4\/","name":"charmander"},{"url":"http:\/\/pokeapi.co\/api\/v2\/pokemon\/5\/","name":"charmeleon"},{"url":"http:\/\/pokeapi.co\/api\/v2\/pokemon\/6\/","name":"charizard"},... 

ответ

1

Это должно быть ваша структура класса.

public class Result 
{ 
    public string url { get; set; } 
    public string name { get; set; } 
} 

public class Pokemon 
{ 
    public int count { get; set; } 
    public object previous { get; set; } 
    public List<Result> results { get; set; } 
} 

Это должно быть действительным json.

{ 
"count": 811, 
"previous": null, 
"results": [{ 
    "url": "http:\/\/pokeapi.co\/api\/v2\/pokemon\/1\/", 
    "name": "bulbasaur" 
}, { 
    "url": "http:\/\/pokeapi.co\/api\/v2\/pokemon\/2\/", 
    "name": "ivysaur" 
}, { 
    "url": "http:\/\/pokeapi.co\/api\/v2\/pokemon\/3\/", 
    "name": "venusaur" 
}, { 
    "url": "http:\/\/pokeapi.co\/api\/v2\/pokemon\/4\/", 
    "name": "charmander" 
}, { 
    "url": "http:\/\/pokeapi.co\/api\/v2\/pokemon\/5\/", 
    "name": "charmeleon" 
}, { 
    "url": "http:\/\/pokeapi.co\/api\/v2\/pokemon\/6\/", 
    "name": "charizard" 
}] 
} 
+0

Спасибо. Это имеет смысл, но как мне избежать создания собственного класса Pokemon и вместо этого использовать внешнюю библиотеку PokeApi.NET? – Bhav

1

Используя пакет Newtonsoft, вы можете десериализовать свой JSON, как этот образец. Также используйте инструмент json2sharp для создания класса C# со своего JSON.

Если у вас есть Web Essentials в Visual Studio, вы всегда можете использовать

Правка> Специальная вставка> JSON как класс.

public class Result 
{ 
    public string url { get; set; } 
    public string name { get; set; } 
} 

public class RootObject 
{ 
    public int count { get; set; } 
    public object previous { get; set; } 
    public List<Result> results { get; set; } 
} 

var results = JsonConvert.DeserializeObject<RootObject>(json); 
0

Есть несколько важных моментов в этом коде:

  • Json генерироваться имеет множество экранирующих символов \, которые не являются идеальными для данных Json и его хорошо для использования, когда строка жестко закодирован в программе C#, чтобы проверить преобразование Json api, например Json.Net, это просто дополнительная информация, поскольку все еще Json остается в силе, однако в течение de-serialiation к объекту в памяти также будут содержать escape-символы как часть данных ,
  • На самом деле вы можете заменить \ with "", чтобы сделать его действительно достоверные данные JSon без экранирующих символов в памяти

Вы упомянули:

Я получаю ответ в моей C# кода, но мне трудно разобрать ответ на объект.

Я считаю, что проблема связана с последней строкой кода, но я не уверен, что это должно быть?

Вы не упомянули, какие проблемы вы столкнулись, в основном мое предположение:

  • Во время данной Десериализации правильно не заполнен некоторые из объектов
  • Некоторые из объектов приводят к ошибке из-за данных, заполненных во время де-сериализации (которые могут быть в основном из-за заполнения дополнительных управляющих символов (см. выше))

Теперь, когда вы вставили другие ответы, когда вы получаете Json данных и вставить специальные с помощью Visual Studio, вы получите точную схему соответствия, но ваша цель состоит в том, чтобы заполнить данные в PokeAPI.Pokemon, так что в чем разница между классами, созданных visual studio и ожидаемыми API, если есть разница, и у вас есть отсутствие контроля над PokeAPI.Pokemon схеме, то Json не нужно изменить, чтобы отобразить в схеме

Json после удаления управляющих символов будут (используемые Jsonlint.com)

{ 
    "count": 811, 
    "previous": null, 
    "results": [{ 
     "url": "http://pokeapi.co/api/v2/pokemon/1/", 
     "name": "bulbasaur" 
    }, { 
     "url": "http://pokeapi.co/api/v2/pokemon/2/", 
     "name": "ivysaur" 
    }, { 
     "url": "http://pokeapi.co/api/v2/pokemon/3/", 
     "name": "venusaur" 
    }, { 
     "url": "http://pokeapi.co/api/v2/pokemon/4/", 
     "name": "charmander" 
    }, { 
     "url": "http://pokeapi.co/api/v2/pokemon/5/", 
     "name": "charmeleon" 
    }, { 
     "url": "http://pokeapi.co/api/v2/pokemon/6/", 
     "name": "charizard" 
    }] 
} 

Вы, возможно, потребуется предоставить больше информации о проблеме, с которыми сталкиваются в точное решение