2014-02-18 81 views
1

首先:我是使用JSON的新手,我使用here上的答案使用Json.Net將數據從Pokemon API反序列化爲C#類(Pokemon類)。我用http://json2csharp.com幫我確定我的類,它看起來像這樣:無法反序列化當前的JSON數組

public class Pokemon 
{ 
    public Pokemon(string json) 
    {   
     JsonConvert.PopulateObject(json, this, PokeApi.JsonSerializerSettings); 
    } 
    [JsonProperty("name")] 
    public string Name { get; set; } 

    [JsonProperty("evolutions")] 
    public Evolutions evolutions { get; set; } 

    [JsonProperty("national_id")] 
    public int national_id { get; set; } 
} 

與一羣喜歡resource_uri,攻擊統計等性能等

由於上述鏈路上提供的答案說,我用JsonConvert.DeserializeObject(JSON),像這樣:

public Pokemon GetPokemon(int nationalId) 
{ 
using (WebClient client = new WebClient()) 
     { 
      var json = client.DownloadString("http://pokeapi.co/api/v1/pokemon/" + nationalId + "/"); 
      var output = JsonConvert.DeserializeObject<Pokemon>(json); 

      return output; 
     } 
    } 

不過,我不斷收到,說:「當前的JSON陣列(例如[1,2,3])不能反序列化爲因爲類型‘演變’異常類型需要JSON對象...「

我發現了很多其他問題,要求相同的確切的事情,但我與頂部答案混淆 - 有時答案是使用JsonProperty,有時是使用JsonConverter,沒有真正解釋所有這些意味着什麼。我需要兩個嗎?

編輯:樣品JSON(撥打:http://pokeapi.co/api/v1/pokemon/1/

{ 
    "abilities": [ 
    { 
     "name": "overgrow", 
     "resource_uri": "/api/v1/ability/1/" 
    }, 
    { 
     "name": "chlorophyll", 
     "resource_uri": "/api/v1/ability/2/" 
    } 
    ], 
    "attack": 49, 
    "catch_rate": 45, 
    "created": "2013-11-02T12:08:25.745455", 
    "defense": 49, 
    "egg_cycles": 21, 
    "egg_groups": [ 
    { 
     "name": "Monster", 
     "resource_uri": "/api/v1/egg/1/" 
    }, 
    { 
     "name": "Grass", 
     "resource_uri": "/api/v1/egg/8/" 
    } 
    ], 
    "ev_yield": "1 Sp Atk", 
    "evolutions": { 
    "level": 16, 
    "method": "level up", 
    "resource_uri": "/api/v1/pokemon/2/", 
    "to": "Ivysaur" 
    }, 
    "exp": 64, 
    "growth_rate": "ms", 
    "happiness": 70, 
    "height": "2'4", 
    "hp": 45, 
    "male_female_ratio": "87.5/12.5", 
    "modified": "2013-11-02T13:28:04.914889", 
    "moves": [ 
    { 
     "learn_type": "other", 
     "name": "Tackle", 
     "resource_uri": "/api/v1/move/1/" 
    }, 
    { 
     "learn_type": "other", 
     "name": "Growl", 
     "resource_uri": "/api/v1/move/2/" 
    }, 
    { 
     "learn_type": "level up", 
     "level": 10, 
     "name": "Vine whip", 
     "resource_uri": "/api/v1/move/3/" 
    } 
    ], 
    "name": "Bulbasaur", 
    "national_id": 1, 
    "resource_uri": "/api/v1/pokemon/4/", 
    "sp_atk": 65, 
    "sp_def": 65, 
    "species": "seed pokemon", 
    "speed": 45, 
    "total": 318, 
    "types": [ 
    { 
     "name": "grass", 
     "resource_uri": "/api/v1/type/5/" 
    }, 
    { 
     "name": "poison", 
     "resource_uri": "/api/v1/type/8/" 
    } 
    ], 
    "weight": "15.2lbs" 
} 

演變類:

public class Evolutions 
{ 
    public int level { get; set; } 
    public string method { get; set; } 
    public string resource_uri { get; set; } 
    public string to { get; set; } 
} 
+0

你能否提供樣本json?也是Evolutions類的模式 – Cris

回答

0

我試圖http://json2csharp.com/http://pokeapi.co/api/v1/pokemon/19/和我所看到的是

public class RootObject 
{ 
    //... 
    public List<Evolution> evolutions { get; set; } 
    //... 
} 

這個漂亮的玉米粥是你的口袋妖怪班。所以你需要將Evolution列爲聲明。

+0

呵呵,我實際上給了「public evolutions evolutions {get; set;}」。我將evolutions聲明爲List,現在我得到了「System.Reflection.TargetInvocationException:異常已被調用的目標拋出---> System.ArgumentNullException」。 – user3294629

+0

add evolutions =新列表()在構造函數中 –

+1

@ user3294629刪除*你的構造函數* –

相關問題