采訪:James Newton-King談Json.NET 4.5
英文原文:Interview: James Newton-King on Json.NET 4.5
作者 Jeff Martin 譯者 曹如進
Json.NET 項目剛剛發布了 .NET JSON 框架4.5版本。新版本包含了許多新特性,并帶來了顯著的速度提升。InfoQ 最近采訪了 Json.NET 的創建者 James Newton-King,采訪過程談及了新版本以及整個項目。
InfoQ: 在最后兩個主要發布的版本(Json.NET 4.0 和4.5)中,你最滿意的特性有哪些?
James Newton-King:對于 Json.NET 4.0,我比較的滿意的是借助 .NET 4.0 而加入的動態支持。我最喜歡添加那些能夠讓我能邊做邊學的特性。例如,在 JObject/JArray/JValue 上實現 IDynamicMetaObjectProvider 對我來說無疑是一個學習的過程,而我也希望當前版本能夠從中受益。在實現的同時,我還需要將其分離以便將它從 Json.NET 支持的舊版本中排除。
將 ISO 8601 日期格式作為默認的序列化格式是 Json.NET 4.5 中我最喜愛的特性。JSON 中的日期對于我來說一直是個頭疼的問題,雖然 Json.NET 一開始就使用了微軟的日期格式,但我從來都不喜歡。JSON 庫的互操作性對于非微軟平臺顯然是個問題,不過更主要的原因是,使用微軟格式的日期易讀性很差。開發人員調試代碼時,ISO 格式“2009-02-15T00:00:00Z”要比微軟的舊日期格式“\/Date (1198908717056)\/”易讀得多。令人驚訝的是,對于該破壞性改動,我還沒有收到任何人的抱怨,我想它的推出肯定讓 .NET 開發人員很開心。
InfoQ:在未來版本中,你最想要看到哪些關鍵特性被添加?(你在 Codeplex 上的特性列表提到了添加 JSON 遞歸上限支持,還有其他的嗎?)
J.N.K.:添加 JSON 遞歸上限支持主要出于兩個原因。第一個原因是因為微軟的 JSON 序列化器支持它,而我想要支持微軟提供的所有特性。我覺得添加一個上限很有用,特別是如果你想公開暴露端點并希望進行鎖定的話。另外一個原因是 ASP.NET MVC 團隊會把 JSON 與 Web API 一同使用。目前他們自己實現了該功能,不過由于添加這個特性很容易,所以我想讓 Web API 與 Json.NET 的工作方式變得與 JSON 的工作方式盡可能地相似。
我從來不為 Json.NET 添加新特性而籌備什么計劃。我傾向于看看 Json.NET 開發人員在一些網站如 StackOverflow 上的提問,看看他們報告給我的 bug,然后想出一些主意來幫助改善這種情況。有的時候新特性與文檔之間存在一個空檔期,以至于開發人員不知道新特性已經有了。
InfoQ:你曾經提到“一個完美的 bug 修復意味著當前性能測試能夠跑得 70,000% 快”,能否給大家解釋一下?
J.N.K.:一位微軟開發人員在對 Json.NET 進行壓力測試后發現,將 100,000個嵌套數組反序列化為 LINQ to JSON 對象花費的時間比想象中的要長得多。性能差的原因是因為 LINQ to JSON 對象會檢查遞歸循環,也就是說,如果一個數組不是它自己的父容器,那么每次當新的嵌套數組反序列化時,都會檢查它所有的父容器,例如,數組 90,001會檢查它的 90,000個父容器,數組 90,002會檢查它的 90,001個父容器等等。顯然這種情況不是很理想。
解決方案很簡單:檢查被添加的條目是否擁有任何子元素。如果一個數組沒有任何子元素的話,那么因為它不可能作為它自身父容器,因此可以跳過遞歸父容器檢查。這一行的代碼改動立刻帶來了由 43 秒到 63 毫秒的速度提升。
InfoQ:4.0-6發布版本著重強調了比 .NET framework 方案更好的性能。你認為 Json.NET 的性能比起它的整個性能集合有重要性如何?
J.N.K.:除了那些需要極限性能的人員之外,幾乎每一位開發人員都會從提高生產效率的特性中獲益,因此平衡兩者變得很重要。我要做的是確保 Json.NET 比 .NET framework 序列化器更快,并同時提供更多功能。
InfoQ:好的,再次感謝James Newton-King 的到來。如果你想要關于所有新特性的完整信息,可以查看這篇宣布;而如果想了解所有項目特性的概述,可以訪問它的 Codeplex 站點。