2016-10-16 157 views
0

我试图了解如何调用API(Pokeapi)并将响应中收到的数据解析为C#中外部库(PokeApi.NET)中的对象。解析来自Pokeapi的JSON

我在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

谢谢。这是有道理的,但我如何避免创建我自己的口袋妖怪类,而是使用PokeApi.NET外部库? – Bhav

1

使用Newtonsoft包,您可以像这个示例反序列化您的JSON。还可以使用json2sharp工具从您的JSON生成C#类。

如果您在Visual Studio中有Web Essentials,你可以随时使用

编辑>粘贴>粘贴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到内存中的对象中,也将包含转义字符作为数据的一部分。
  • 事实上,你可能会取代\ with "",使其不转义字符真正有效的JSON数据存储在存储器

你提到:

我收到我的C#的响应代码,但我很难解析响应到一个对象。

我认为这个问题与最后一行代码有关,但我不确定它应该是什么?

您还没有提到,你正面临什么样的问题,主要是我的假设是:

  • 在反序列化的数据是不是在一些对象
  • 的正确填写某些对象的导致错误由于反序列化时填写的数据(可大多是由于填充额外的转义字符以上(自提))

现在,作为粘贴其他的答案也一样,当你得到Json数据和粘贴特殊使用视觉工作室,你会得到完全匹配的模式,但你的目标是填写数据在PokeAPI.Pokemon,所以视觉工作室生成的类和预期的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" 
    }] 
} 

您可能需要提供关于面临的问题的详细信息确切的解决方案