4. 物件序列化
這個要先知道輸出的json字串長什麼樣子
然後
01 | protected void Page_Load(object sender, EventArgs e) | 
 
06 |         string collapse_key = "score_update"; | 
 
07 |         int time_to_live = 108; | 
 
08 |         bool delay_while_idle = true; | 
 
10 |         string time = "15:16.2342"; | 
 
11 |         List<string> registration_ids = new List<string>() { "4","8","15","16","23","42"}; | 
 
15 |         RootObject root = new RootObject(); | 
 
16 |         root.collapse_key = collapse_key; | 
 
17 |         root.time_to_live = time_to_live; | 
 
18 |         root.delay_while_idle = delay_while_idle; | 
 
19 |         Data data = new Data(); | 
 
21 |         root.data.score = score; | 
 
22 |         root.data.time = time; | 
 
23 |         root.registration_ids = registration_ids; | 
 
25 |         string strJson = JsonConvert.SerializeObject(root, Formatting.Indented); | 
 
27 |         Response.Write(strJson); | 
 
 
 
 
或使用物件初始化方式塞值
01 | protected void Page_Load(object sender, EventArgs e) | 
 
06 |         string collapse_key = "score_update"; | 
 
07 |         int time_to_live = 108; | 
 
08 |         bool delay_while_idle = true; | 
 
10 |         string time = "15:16.2342"; | 
 
11 |         List<string> registration_ids = new List<string>() { "4","8","15","16","23","42"}; | 
 
15 |         RootObject root = new RootObject() | 
 
17 |             collapse_key = collapse_key, | 
 
18 |             time_to_live = time_to_live, | 
 
19 |             delay_while_idle = delay_while_idle, | 
 
25 |             registration_ids = registration_ids | 
 
29 |         string strJson = JsonConvert.SerializeObject(root, Formatting.Indented); | 
 
31 |         Response.Write(strJson); | 
 
 
 
 
使用物件初始化方式塞值看起來直覺多了
不過為了物件序列化還要特地宣告類別,這…倒不如使用Linq吧
5.用Linq+匿名物件寫法 直接組JSON
但只有範例,沒寫為什麼Linq要那樣寫,誰看得懂阿XD
要用Linq直接組JSON
大概把握幾點:
Json Object:Json字串用大括號{}表示,Linq也是用大括號{}表示
Json Object的Name(Key、Property):Json字串在兩個雙引號””裡寫一個英文單字,Linq就直接寫英文單字即可
Json Array:Json字串用中括號[]表示,Linq就用from o in XXX select o,這種回傳IEnumerable的寫法(如果JSON字串是物件陣列的話就用from o in XXX select new {欄位1=YYY}這種形式)
Json Value:Linq就看Json字串填什麼值就跟著填什麼值
01 | protected void Page_Load(object sender, EventArgs e) | 
 
06 |         List<string> registration_ids = new List<string>() { "4", "8", "15", "16", "23", "42" }; | 
 
11 |                             collapse_key = "score_update", | 
 
13 |                             delay_while_idle = true, | 
 
18 |                             registration_ids = from s in registration_ids | 
 
24 |         Response.Write(JsonConvert.SerializeObject(result)); | 
 
 
 
 
請看圖示解說↓
由於Linq支援DataTable的查詢,所以再難的JSON格式都組得出來,不用再跑for迴圈寫一堆Code,開發速度大幅提昇
以下截自實務上的一段Code(有做了一點修改)
01 | DataTable dt = new DataTable(); | 
 
02 | DataTable dtDetail = new DataTable(); | 
 
03 | var firstLevel = dt.Select("pid is NULL"); | 
 
08 |         Level1 = from a in firstLevel | 
 
09 |                  join b in dt.AsEnumerable() on a.Field<int>("id") equals b.Field<int?>("pid") into secondLevel | 
 
12 |                      Title =  a.Field<string>("Title"), | 
 
13 |                      Level2 = secondLevel.Select(c => new | 
 
15 |                          Title =  c.Field<string>("Title"), | 
 
16 |                          Photos = from s in secondLevel | 
 
17 |                                        join uu in dtDetail.AsEnumerable() on s.Field<int>("id") equals uu.Field<int>("id") | 
 
18 |                                        where s.Field<int>("id") == c.Field<int>("id") | 
 
21 |                                     PhotoID = uu.Field<string>("PhotoID"), | 
 
22 |                                     PhotoTitle = uu.Field<string>("PhotoTitle") | 
 
 
 
 
※不過要注意對於寫的人是寫很快,後人維護會有閱讀困難的可能
最後附上一張比較圖