同事專案上碰到Json字串過長的問題,他使用MVC 內建的序列化方回傳Json 資料
卻出現「使用 JSON JavaScriptSerializer 序列化或還原序列化期間發生錯誤。字串的長度超過在 maxJsonLength 屬性上設定的值。」的錯誤訊息,
改用Json.Net 意外發現,兩者的效能差很多...
使用MVC 內建的序列化方回傳Json 資料,
如下:
public JsonResult GetData()
{
return Json(new xxxObject());
}
會出現「使用 JSON JavaScriptSerializer 序列化或還原序列化期間發生錯誤。字串的長度超過在 maxJsonLength 屬性上設定的值。」的錯誤訊息,
原因是因為透過Json() 這個方法回傳資料時,會透過「JavaScriptSerializer」這個類別來幫我們序列化物件,該元件有預設限制Json字串的大小。
- 預設值為 2097152 個字元,相當於 4 MB 的 Unicode 字串資料。
心想的解決方案的順序為:
- 調整WebConfig
- 在WebConfig 加入「<jsonSerialization maxJsonLength="1024000"></jsonSerialization>」更改預設大小。
- 更改「JavaScriptSerializer」序列化限制。
- 類別參數「MaxJsonLength」讓可序列化的長度變長。
沒想到該同仁卻使使用Json.Net 的 JsonConvert.SerilizeObject ,來序列化物件並且順利解決字串長度過長的問題,
Json.Net 並沒有限制序列化後字串的大小,自然也不會出現長度過長的錯誤訊息;不過弔詭的是就算後段序列化成功,
理論上到前端也會壞掉,因為同仁並沒有對config 做任何調整,所以到前端一樣會出現長度過長的錯誤。
合理懷疑兩個元件序列化後的長度一定不一樣,實際上測試:
可以發現透過「JavaScriptSerializer」比較長,使用Json.Net 「 JsonConvert.SerilizeObject 」比較短,這也就可以合理解釋為何同仁更換元件候,系統就可以正常運行的原因了。
上Json.Net 的官網可以查到一些統計資訊,可以發現使用Json.Net 的效能會好很多,
黑暗執行緒也有一篇文章「JSON轉換效能評比-Json.NET,就決定是你了!」,有做更詳細的比較,也顯示Json.Net 確實非常適合拿來使用。
結論:
- 要序列化物件請找「Json.Net」。
- 為何要限制Json的大小
- 避免太大的Json資料讓瀏覽器剖析太久。
- 太大的資料量會消耗傳輸量,對系統並非好事。