[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 的標籤: ,,

Leave a comment

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料