2016-10-16 210 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" 
    }] 
} 

您可能需要提供關於面臨的問題的詳細信息確切的解決方案