JSON
								
									API
								
									RESTful
								
							
						
					
					
					JSON資料傳輸格式,規劃方法及使用技巧與實務容易遇到之問題
								
								
								2017/12/29 00:23:08
							
							
								
									
										 
												 0
										
										
									
									
								
								 12688
							
						JSON資料傳輸格式,規劃方法及使用技巧與實務容易遇到之問題
|   簡介  |  
    現今由於App資料傳輸的輕量化,以及物件導向程式設計的架構,現今主流的程式語言皆可透過JSON序列化和反序列化的方式將JSON轉換為物件,如此常使用的傳輸格式,雖然方便,但新手在使用時,也是會遇到許多小問題,因此透過此篇文章帶大家來了解JSON格式,以及規劃時需要注意的地方。 | 
|   作者  |  
    康皓鈞 | 
JSON資料傳輸格式,規劃方法及使用技巧
     JSON(JavaScript Object Notation)是一種由道格拉斯·克羅克福特構想設計、輕量級的資料交換語言,以文字為基礎,且易於讓人閱讀。現今由於App資料傳輸的輕量化,以及物件導向程式設計的架構,現今主流的程式語言皆可透過JSON序列化和反序列化的方式將JSON轉換為Object,十分方便。許多主流的Web Service都採用RESTful Service搭配JSON資料格式進行傳輸,這篇將介紹JSON格式的規劃、在程式上的應用,以及一些實務遇到的問題。
    
    JSON的格式
         
     JSON主要的格式是以name以及value所組成的,JSON 的官方 MIME 類型是 application/json,主要分成兩個主要的結構:
    
    物件(object) 用大括號 { }
陣列(array) 用中括號 [ ]
物件(object) 結構
    
     由圖示表示,JSON Object是由兩個大括號所包住的,string為參數的name,value則為數值,中間每個參數可用”逗號,”做區隔。
    
    
     Value可放的內容可參閱下圖,包含string, number, json object, array, boolean, null。
    
    
    
     在此需要注意,由於
     JSON
     沒有區分
     int, double, float, Decimal
     等等的數值型態。 
    
    陣列(array)結構
         
    
     array
     則是由中括號所組成,array內的物件皆不需要有額外的命名,由於array是屬於value的一種,因此array外層應當給予命名,例如
     ”
     arrayName
     ”
     :[value1, value2, value3]
     ,而array內的value就如同剛剛上述所描述的value,因此array內可以放string, number, json object, array皆是可以的,這樣的設計皆與物件導向的物件結構設計息息相關。
    
    
實用的Json工具:
         
     JSON String解析網站  https://jsoneditoronline.org/
    
    
     該網站可將JSON文字貼於左方框格,按下向右箭頭後可將JSON參數整理顯示, 若格式有錯也會提示錯誤發生的地方,右方也可以修改JSON內容後按向左箭頭轉回成JSON格式。
    
    
    
     JSON to C# 網站http://json2csharp.com/
    
    
     該網站可將JSON文字直接轉換為C#物件,若已有JSON範本時,可直接進行接收端物件的設計。
    
    
    
     C# to JSON網站  http://csharp2json.azurewebsites.net/
    
    
     該網站可將C#物件轉換為JSON字串。
    
    實務上常遇問題
         
1.數值型態轉換為物件時需特別注意
         
     由於
     JSON
     是用
     number
     來代表所有數值類型的型態,因此在傳輸上物件的設計需特別小心
     int
     整數的型態,若傳輸端錯將
     int
     傳成
     1.0
     之類後面附帶小數點的數值時,透過反序列化轉換到物件的時候會發生型態轉換上的問題,因此在實務上接收和傳送
     JSON
     資料時,建議在開發時期將整個
     JSON string
     記錄下來,才能知道原始
     JSON
     檔案的樣貌。另外也建議在開發時,須雙方確認原始程式內物件的資料型態、長度、可否接受
     null
     型態,以免物件在轉換時,或是寫入資料庫時發生錯誤。
    
    
    
    
2.時間格式 
         
     由於目前許多的應用需考慮到時區與標準時間,因此正確的時間格式後方需附帶時區資訊,而傳輸端有時可能會有自己的時區,也可能以
     UTC
     時間來提供時間,我們可於
     JsonSerializerSettings
     初始化時加入
    
    
    
    DateTimeZoneHandling = DateTimeZoneHandling.Local 或是DateTimeZoneHandling = DateTimeZoneHandling.UTC
如此在反序列化為DateTime格式時,或是轉換為JSON時,將會附帶時區,而不導致混淆。
3.防止JSON轉換物件時,因為JSON無該參數而倒至轉換失敗
         
var settings = new JsonSerializerSettings
      {    
          MissingMemberHandling = MissingMemberHandling.Ignore 
      };
 
Response<T> repT = JsonConvert.DeserializeObject<Response<T>>(json, settings);
如此在反序列化時,Json即使沒有該參數,也能進行轉換,只是該參數反序列化為物件後會為null,而非發生錯誤。
						
								
								
								
								
								
								
								
								
								
								
								
								