對 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 的。