一些JSON相关的函数
JSON作为一种轻量的数据传输格式,越来越受到人们的青睐。下面是我仿照Prototype的一些实现。
JSONFilter:/^\/\*-secure-([\s\S]*)\*\/\s*$/, unfilterJSON: function (json,filter) { return json.replace((filter || dom.JSONFilter), function (a,b){ return 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*/' dom.unfilterJSON(text) // -> '{"name": "Violet", "occupation": "character", "age": 25}' |
到时我们用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); //判定是否符合JSON的格式 from http://json.org/json2.js if ( !sanitize || dom.isJSONText(json) ) { return window.JSON && window.JSON.parse ? window.JSON.parse( json ) : ( new Function( "return " + json))(); } else { throw "Invalid JSON: " + json; } } //is函数见:http://www.cnblogs.com/rubylouvre/archive/2010/01/20/1652646.html var data =dom.evalJSON( '{ "name": "Violet", "occupation": "character" }' ); data.name; //-> "Violet" |
第四函数,将JSON对象变成文本。
// http://stackoverflow.com/questions/1306232/how-debug-javascript-with-ie-8 // var a = [1,2,3,4,{aa:8}]; puts(dom.toJSON(a)) toJSON: function (obj){ if (window.JSON && window.JSON.stringify) { return JSON.stringify(obj) } if ( typeof window.uneval == 'function' ) { return uneval(obj); } if ( typeof obj == 'object' ) { if (!obj) { return 'null' ; } var list = []; if (dom.is(obj, "Array" )) { for ( var i=0,n=obj.length;i <n;i++) { list.push(dom.toJSON(obj[i])); } return '[' + list.join( ',' ) + ']' ; } else { 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 ') + ' "'; } else { return new String(obj); } }, |
toJSON : function (obj) { if (is(window.JSON, "JSON" )){ return JSON.stringify(obj) } function f(n) { 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; var meta = { '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '" ' : '\\"' , '\\' : '\\\\' }; function _char(c) { return meta[c] ? meta[c] : '\\u' +( '0000' +(+(c.charCodeAt(0))).toString(16)).slice(-4); } function _string(s) { return '"' + s.replace(escapable, _char) + '"' ; } if (is(obj,"Date ")){ 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 ")){ return obj+'' }else if(is(obj," String ")){ return _string(obj) }else if(obj === null){ return " 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) if (!value) results.push(dom.toJSON(key) + ': ' + value); }); return '{' + results.join( ', ' ) + '}' ; } else { return undefined; } }, |
当然你完全也可以用json2,那个绝对权威。但如果你自行实现一下,感受是完全不一样的。
如果您觉得此文有帮助,可以打赏点钱给我支付宝1669866773@qq.com ,或扫描二维码


机器瞎学/数据掩埋/模式混淆/人工智障/深度遗忘/神经掉线/计算机幻觉/专注单身二十五年
标签:
javascript
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库