[Windows Store App]_獲取Json來源後,透過Json.NET反序列化轉換成物件

[Windows Store App]_獲取Json來源後,透過Json.NET轉換成物件

前一陣子有發一篇怎麼快速用Visual Studio的功能快速透過已有的JSON內容,讓Visual Studio自動的解析並且產生JSON的物件框架

 

 

但那時候其實沒有實作的需求,所以沒有想說要怎麼讓抓下來的Json能夠快速的方式反序列化成物件,

 

今天要寫Store App用到的JSON資料,想說應該可以嘗試的把它反序列化成物件

 

 

查了一下,最簡單直覺快速的方式還是利用JSON.NET這個套件來做

 

可以透過Nuget安裝

http://www.nuget.org/packages/Newtonsoft.Json

 

裝妥之後,請先備妥你要處裡的JSON,並且參照以下文章建立一個JSON的解析框架:

http://www.dotblogs.com.tw/thkaw/archive/2013/10/31/126241.aspx

 

 

以下範例是要將Battlefield 4的戰士資料給解析下來,所以透過上面文章做出來的內容如下:

   1: class playerRankingJsonFormat
   2:    {
   3:  
   4:        public class Rootobject
   5:        {
   6:  
   7:            public List<Ranking> rankings { get; set; }
   8:        }
   9:  
  10:  
  11:        public class Ranking
  12:        {            
  13:            public string group { set{group_s=value;} }
  14:            public string ident { get; set; }
  15:            public int pid { get; set; }
  16:            public object rank { get; set; }
  17:            public int count { get; set; }
  18:            public object value { get; set; }
  19:            public object url { get; set; }
  20:            public string label { get; set; }
  21:            public string _short { get; set; }
  22:            public string format { get; set; }
  23:  
  24:        }
  25:  
  26:    }

 

但你要在需要對應到Json標籤名稱的變數做標示

可以加入[JsonProperty]這個標籤來告訴JSON.NET說找到JSON內容相同名稱的內容可以MAPPING到這個變數中

 

或者加入[JsonIgnore]來告訴JSON.NET說若需要序列化這個物件時,這個變數不要跟著序列化

 

而物件類別上面需要加入[JsonObject(MemberSerialization.OptOut)]來當需要序列化列別的宣告,不過本篇是著重於反序列化成物件

所以是要加入[JsonObject(MemberSerialization.OptIn)]

 

我這邊是要把所有JSON資料都反序列化成物件,因此我這邊最後修改上方的內容變成:

   1: class playerRankingJsonFormat
   2:    {
   3:        [JsonObject(MemberSerialization.OptIn)]
   4:        public class Rootobject
   5:        {
   6:            [JsonProperty]
   7:            public List<Ranking> rankings { get; set; }
   8:        }
   9:  
  10:        [JsonObject(MemberSerialization.OptIn)]
  11:        public class Ranking
  12:        {
  13:            [JsonProperty]
  14:            public string group { set{group_s=value;} }
  15:  
  16:            public string group_s { get; set; }
  17:  
  18:            [JsonProperty]
  19:            public string ident { get; set; }
  20:            [JsonProperty]
  21:            public int pid { get; set; }
  22:            [JsonProperty]
  23:            public object rank { get; set; }
  24:            [JsonProperty]
  25:            public int count { get; set; }
  26:            [JsonProperty]
  27:            public object value { get; set; }
  28:            [JsonProperty]
  29:            public object url { get; set; }
  30:            [JsonProperty]
  31:            public string label { get; set; }
  32:            [JsonProperty]
  33:            public string _short { get; set; }
  34:            [JsonProperty]
  35:            public string format { get; set; }
  36:  
  37:        }
  38:  
  39:    }

 

這樣子就完成JSON物件的部分~~~

 

 

接著是程式碼的部分

透過HttpClient拿到JSON之後,再透過JsonCovert去做反序列化的動作

   1: public async Task<playerRankingJsonFormat.Rootobject> Init_parseJson(string playerName)
   2:        {
   3:           string sjRanking = await MakeWebRequest("http://api.bf4stats.com/api/playerRankings?plat=pc&name=" + playerName + "&output=json");
   4:            jRanking = JsonConvert.DeserializeObject<playerRankingJsonFormat.Rootobject>(sjRanking); //DeserializeObject後面接上你JSON框架的物件名稱
   5:  
   6:            
   7:            return jRanking; 
   8:        }
   9:  
  10: public async Task<string> MakeWebRequest(string url)
  11:       {
  12:           HttpClient http = new System.Net.Http.HttpClient();
  13:           HttpResponseMessage response = await http.GetAsync(url);
  14:           return await response.Content.ReadAsStringAsync();
  15:       }

 

這樣你就能用像使用物件的方式去任意的操作JSON內容

 

 

我只能說這樣真的超方便,就不用在手動辛苦的去PARSE JSON…

 

以上~

 

如果想要知道序列化的方式,可參考:

http://www.allenj.net/?p=2645

 

Technorati 的標籤: ,,