[Asp .Net MVC] JavaScriptSerializer vs Json.Net

同事專案上碰到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 字串資料。

心想的解決方案的順序為:

  1. 調整WebConfig
    1. 在WebConfig 加入「<jsonSerialization maxJsonLength="1024000"></jsonSerialization>」更改預設大小。
  2. 更改JavaScriptSerializer」序列化限制。
    1. 類別參數「MaxJsonLength」讓可序列化的長度變長。

沒想到該同仁卻使使用Json.Net 的 JsonConvert.SerilizeObject ,來序列化物件並且順利解決字串長度過長的問題,

Json.Net 並沒有限制序列化後字串的大小,自然也不會出現長度過長的錯誤訊息;不過弔詭的是就算後段序列化成功,

理論上到前端也會壞掉,因為同仁並沒有對config 做任何調整,所以到前端一樣會出現長度過長的錯誤。

合理懷疑兩個元件序列化後的長度一定不一樣,實際上測試:

可以發現透過JavaScriptSerializer」比較長,使用Json.Net 「 JsonConvert.SerilizeObject 」比較短,這也就可以合理解釋為何同仁更換元件候,系統就可以正常運行的原因了。

上Json.Net 的官網可以查到一些統計資訊,可以發現使用Json.Net 的效能會好很多,

黑暗執行緒也有一篇文章「JSON轉換效能評比-Json.NET,就決定是你了!」,有做更詳細的比較,也顯示Json.Net 確實非常適合拿來使用。

結論:

  1. 要序列化物件請找「Json.Net」。
  2. 為何要限制Json的大小
    1. 避免太大的Json資料讓瀏覽器剖析太久。
    2. 太大的資料量會消耗傳輸量,對系統並非好事。