生活随笔
收集整理的這篇文章主要介紹了
一些JSON相关的函数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
JSON作為一種輕量的數據傳輸格式,越來越受到人們的青睞。下面是我仿照Prototype的一些實現。
JSONFilter:/^///*-secure-([/s/S]*)/*///s*$/, |
unfilterJSON:function(json,filter) { |
????return json.replace((filter || dom.JSONFilter), function(a,b){ |
JSONFilter完全抄自Prototype,因為后臺基本上只會傳輸兩種格式的東西給我們——文本(xmlhttp.responseText)與XML(xmlhttp.responseXML)。如果要json,我們可以eval一下,或者使用現代瀏覽器提供的JSON.parse方法。但問題就出在eval中,很容易出現XSS攻擊。如果文本是注釋就可以避免這問題,在Prototype中還檢察一下請求的來源。對于自家的網站的請求,我們完全可以在請求前處理一下,讓它變成如下格式:
var text = '/*-secure-/n{"name": "Violet", "occupation": "character", "age": 25}/n*/' |
到時我們用unfilterJSON函數提取合法的字段來eval就沒問題了。
第二個函數,判斷字符串是否符合JSON的格式。JSON是有固定的格式,要求鍵必須被雙引號括起來。下面的函數提取自json2:
isJSONText:function(json){ |
????return /^[/],:{}/s]*$/.test(json.replace(///(?:["bfnrt]|u[0-9a-fA-F]{4})/g, "@") |
????????.replace(/"[^"///n/r]*"|true|false|null|-?/d+(?:/./d*)?(?:[eE][+/-]?/d+)?/g, "]") |
????????.replace(/(?:^|:|,)(?:/s*/[)+/g, "")); |
第三個函數,將符合JSON的格式的文本變成JSON對象。第二參數用于指明此文本是否安全(如,是否同源請求)。如果能用原生對象的parse方法就用原生的,否則動態解析它。之所以不用eval,是因為ecma那幫人頭腦發熱,想禁掉它。
????????evalJSON: function( json ,sanitize) {?? |
????????????if ( !is(json,"String") || !json ) |
????????????????return null; |
????????????json = dom.unfilterJSON(json); |
????????????if ( !sanitize || dom.isJSONText(json) ) { |
????????????????return window.JSON && window.JSON.parse ? |
????????????????window.JSON.parse( json ) : (new Function("return " + json))(); |
????????????????throw? "Invalid JSON: " + json; |
var data =dom.evalJSON( '{ "name": "Violet", "occupation": "character" }'); |
第四函數,將JSON對象變成文本。
????if (window.JSON && window.JSON.stringify) { |
????????return JSON.stringify(obj) |
????if (typeof window.uneval == 'function') { |
????????return uneval(obj); |
????if (typeof obj == 'object') { |
????????????return 'null'; |
????????if (dom.is(obj,"Array")) { |
????????????for (var i=0,n=obj.length;i <n;i++) { |
????????????????list.push(dom.toJSON(obj[i])); |
????????????return '[' + list.join(',') + ']'; |
????????????for (var prop in obj) { |
????????????????if(obj[has](prop)) |
????????????????????list.push('"' + prop + '":' + dom.toJSON(obj[prop])); |
????????????return '{' + list.join(',') + '}'; |
????} else if (typeof obj == 'string') { |
????????return '"' + obj.replace(/(["'])/g, '//$1') + '"'; |
????????return new String(obj); |
????if(is(window.JSON,"JSON")){ |
????????return JSON.stringify(obj) |
????????return n < 10 ? '0' + n : n; |
????var escapable = /[///"/x00-/x1f/x7f-/x9f/u00ad/u0600-/u0604/u070f/u17b4/u17b5/u200c-/u200f/u2028-/u202f/u2060-/u206f/ufeff/ufff0-/uffff]/g; |
????????return meta[c] ? meta[c] :'//u'+('0000'+(+(c.charCodeAt(0))).toString(16)).slice(-4); |
????function _string(s) { |
????????return '"' + s.replace(escapable, _char) + '"'; |
????????return? '"' + obj.getUTCFullYear() + '-' + |
????????f(obj.getUTCMonth() + 1) + '-' + |
????????f(obj.getUTCDate())????? + 'T' + |
????????f(obj.getUTCHours())???? + ':' + |
????????f(obj.getUTCMinutes())?? + ':' + |
????????f(obj.getUTCSeconds())?? + 'Z"' ; |
????}else if(is(obj,"Number")){ |
????????return isFinite(obj) ? obj+'' : 'null'; |
????}else if(is(obj,"Boolean")){ |
????}else if(is(obj,"String")){ |
????????return _string(obj) |
????}else if(obj === null){ |
????}else if(is(obj,"Array")){ |
????????return '[' + (dom.filter(obj,function(value){ |
????????????return dom.toJSON(value) !== undefined; |
????????})).join(', ') + ']'; |
????}else if(is(obj,"Object")){ |
????????var results = []; |
????????dom.each(obj,function(value,key){ |
????????????value = dom.toJSON(value) |
????????????????results.push(dom.toJSON(key) + ': ' + value); |
????????return '{' + results.join(', ') + '}'; |
????????return undefined; |
?
Is函數
?
目前最精確的判定方法(不包括自定義類型)
????????var is = function (obj,type) { |
????????return (type === "Null" && obj === null) || |
????????(type === "Undefined" && obj === void 0 ) || |
????????(type === "Number" && isFinite(obj)) || |
?????????Object.prototype.toString.call(obj).slice(8,-1) === type; |
用法如下:
????????var forEach = function(array,fn,bind){ |
??????????if(is(array,"Array") && is(Array.forEach,"Function")){ |
????????????array.forEach(fn,bind); |
????????????for(var i=0,n=array.length;i<n;i++){ |
??????????????i in array && fn.call(bind,array[i],i,array) |
另一個變種,直接返回表示類型的字符串
var getType = function (obj) { |
??var _toString = Object.prototype.toString,undefined; |
??return obj === null? "Null": |
????obj === undefined ? "Undefined": |
????_toString.call(obj).slice(8,-1); |
用法:
??????alert(getType(arr)); |
??????alert(getType(nil)) |
??????alert(getType(und)) |
??????var spans = document.getElementsByTagName("span"); |
??????alert(getType(spans)) |
??????alert(getType(spans[0].childNodes)) |
function isA (thing, canon) { |
??if (thing == null || canon == null) { |
????return thing === canon; |
??return Object.getPrototypeOf(Object(thing)) == Object.getPrototypeOf(Object(canon)); |
function isBool (thing) { |
??return isA(thing, true); |
function isNumber (thing) { |
??return isA(thing, 0) && isFinite(thing); |
function isString (thing) { |
總結
以上是生活随笔為你收集整理的一些JSON相关的函数的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。