[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…
以上~
如果想要知道序列化的方式,可參考: