JSON API RESTful

JSON資料傳輸格式,規劃方法及使用技巧與實務容易遇到之問題

康皓鈞 2017/12/29 00:23:08
10794

JSON資料傳輸格式,規劃方法及使用技巧與實務容易遇到之問題


簡介

現今由於App資料傳輸的輕量化,以及物件導向程式設計的架構,現今主流的程式語言皆可透過JSON序列化和反序列化的方式將JSON轉換為物件,如此常使用的傳輸格式,雖然方便,但新手在使用時,也是會遇到許多小問題,因此透過此篇文章帶大家來了解JSON格式,以及規劃時需要注意的地方。

作者

康皓鈞


JSON資料傳輸格式,規劃方法及使用技巧

JSONJavaScript 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為參數的namevalue則為數值,中間每個參數可用逗號,做區隔。
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#物件轉換為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無該參數而倒至轉換失敗

可將 JsonSerializerSettings初始化時加入 MissingMemberHandling
 
 

var settings = new JsonSerializerSettings
     {   

          MissingMemberHandling = MissingMemberHandling.Ignore
     };

 

Response<T> repT = JsonConvert.DeserializeObject<Response<T>>(json, settings);

 

如此在反序列化時,Json即使沒有該參數,也能進行轉換,只是該參數反序列化為物件後會為null,而非發生錯誤。

康皓鈞