json2.js 和 toJSON()

JSON 有認識加上有寫過 JavaScript 來處理 JSON 的人或許都知道 "json2.js":http://www.json.org/js.html 這個 Douglas Crockford 寫的 JSON 處理器,他可以安全的轉換 JSON 和 JavaScript 的物件,不過我因為資料封裝的問題,希望能自己實作子物件的 toJSON function,本來看了一下 json2.js 的原始碼以為他可以支援,不過實際測試後才發現直接用 json2.js 會造成 toJSON 函式產生的字串會多過一次 quote 的動作,舉例來說{"a":3}會被轉成{"a":3},結果就是造成轉回物件的時候得到錯誤的結果,為了處理這個問題,我寫了 一個 function 來包 json2.js,用法可以參考 test 頁的原始碼,不過簡單說,就是把物件丟給他,他會傳回一個 function,執行這個 function 就會得到 JSON 格式字串,當然子物件有toJSON的話就會先用它,沒的話才會用JSON.stringify

不過使用上有個小小的安全性問題要注意,我是假設 toJSON 傳回的字串是安全的,當然這樣假設很危險,所以我自己的物件實作 toJSON 時也是把想要傳回的物件先建立起來,然後丟給 JSON.stringify ,如果考慮到自己的子物件也有實作 toJSON 的話,那丟給我寫的 toJSON 也是可以的。

查了一下 YUI 的文件 ,發現原來 JSON2.js 的設計裡,物件自己作 toJSON 的方法是傳新的物件,而不是傳已經轉成 string 的。