JSON
API
RESTful
JSON資料傳輸格式,規劃方法及使用技巧與實務容易遇到之問題
2017/12/29 00:23:08
0
10856
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,而非發生錯誤。