2012年4月30日 星期一

JSON.parse 無去剖析 .NET2 的JSON 日期

(http://www.json.org/ 提供各種程式語言上使用的 JSON元件)
當選用http://www.json.org/ 提供的 json2.js ,搭配 ASP.NET 進行資料溝通時,會發現由 ASP.NET回傳的物件如果包含有日期物件時,json2.js 的 JSON.parse() 解析功能會出錯。
經追蹤結果:
日期物件在 .NET 端利用 JSON.toJSON(物件) 進行序列化時,會被轉成 new Date(毫秒值) 的字串,當此字串傳給前端 json2.js 的 JSON.parse(字串)時,在462 到 465行的地方執行之後,會引發錯誤
            if (/^[\],:{}\s]*$/
                    .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') 
                        .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
                        .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
只要再463行之後再加入 .replace(/new Date\([0-9]*\)/ig,'') 即可。
因為原來的 RegExp取代並不會算到 new Date(),所以 /^[\],:{}\s]*$/.test 結果永遠為 false,加入
.replace(/new Date\([0-9]*\)/ig,'') 之後
 
            if (/^[\],:{}\s]*$/
                    .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
                        .replace(/new Date\([0-9]*\)/ig,'')
                        .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
                        .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
 
就可以讓 new Date(...) 也可通知 test 
 

沒有留言:

張貼留言