1

我从存储在 javascript var 中的服务器获取文本响应。我可以完全控制此响应的格式。通常这个文本响应有 3 个我需要的元素,理想情况下我想用它json.parse来解决我的问题,比如:

var json = '{"result":true,"count":1, "state":"ON"}',
obj = JSON.parse(json);

alert(obj.result);
alert(obj.count);
alert(obj.state);

优雅而简单,但是像 IE8,7,6 这样的旧浏览器不支持 json.parse。在这一点上,我有两种可能的解决方案,一种当然是使用 Jquery,但我不想要,因为我想让我的代码尽可能小,另外两个可能是使用像json2这样的库来为我处理像 jquery 这样的不兼容问题确实如此,但同样的问题,对于这样一个简单的功能来说,代码太多了。

所以我认为最好的方法是将响应格式更改为类似true%1%ON然后拆分%,你怎么看?在我看来有点脏。

4

4 回答 4

3

您可以从现有库中提取解析器的代码,而不是拥有所有东西,因为您只需要解析器。一个例子是从 jQuery 核心中提取(第 523-551 行)的实现。$.parseJSON显然它使用new Function方法而不是eval.

于 2013-04-22T23:09:08.840 回答
1

在我因不阅读问题而受到指责之前,让我改述一下:

在我看来(并不重要)使用该json2.js库不会导致显着的性能损失,它也不需要包含很多代码,尤其是在最小化时:

if(typeof JSON!=="object"){JSON={}}(function(){"use strict";function f(e){return e<10?"0"+e:e}function quote(e){escapable.lastIndex=0;return escapable.test(e)?'"'+e.replace(escapable,function(e){var t=meta[e];return typeof t==="string"?t:"\\u"+("0000"+e.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+e+'"'}function str(e,t){var n,r,i,s,o=gap,u,a=t[e];if(a&&typeof a==="object"&&typeof a.toJSON==="function"){a=a.toJSON(e)}if(typeof rep==="function"){a=rep.call(t,e,a)}switch(typeof a){case"string":return quote(a);case"number":return isFinite(a)?String(a):"null";case"boolean":case"null":return String(a);case"object":if(!a){return"null"}gap+=indent;u=[];if(Object.prototype.toString.apply(a)==="[object Array]"){s=a.length;for(n=0;n<s;n+=1){u[n]=str(n,a)||"null"}i=u.length===0?"[]":gap?"[\n"+gap+u.join(",\n"+gap)+"\n"+o+"]":"["+u.join(",")+"]";gap=o;return i}if(rep&&typeof rep==="object"){s=rep.length;for(n=0;n<s;n+=1){if(typeof rep[n]==="string"){r=rep[n];i=str(r,a);if(i){u.push(quote(r)+(gap?": ":":")+i)}}}}else{for(r in a){if(Object.prototype.hasOwnProperty.call(a,r)){i=str(r,a);if(i){u.push(quote(r)+(gap?": ":":")+i)}}}}i=u.length===0?"{}":gap?"{\n"+gap+u.join(",\n"+gap)+"\n"+o+"}":"{"+u.join(",")+"}";gap=o;return i}}if(typeof Date.prototype.toJSON!=="function"){Date.prototype.toJSON=function(e){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(e){return this.valueOf()}}var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={"\b":"\\b","   ":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},rep;if(typeof JSON.stringify!=="function"){JSON.stringify=function(e,t,n){var r;gap="";indent="";if(typeof n==="number"){for(r=0;r<n;r+=1){indent+=" "}}else if(typeof n==="string"){indent=n}rep=t;if(t&&typeof t!=="function"&&(typeof t!=="object"||typeof t.length!=="number")){throw new Error("JSON.stringify")}return str("",{"":e})}}if(typeof JSON.parse!=="function"){JSON.parse=function(text,reviver){function walk(e,t){var n,r,i=e[t];if(i&&typeof i==="object"){for(n in i){if(Object.prototype.hasOwnProperty.call(i,n)){r=walk(i,n);if(r!==undefined){i[n]=r}else{delete i[n]}}}}return reviver.call(e,t,i)}var j;text=String(text);cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(e){return"\\u"+("0000"+e.charCodeAt(0).toString(16)).slice(-4)})}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,""))){j=eval("("+text+")");return typeof reviver==="function"?walk({"":j},""):j}throw new SyntaxError("JSON.parse")}}})()

您可以仅使用一行将其放入并完成。为已经完成的事情编写自己的语法将花费大量时间来完成其他工作以完成您的项目。您将编写的任何代码都必须经过与该库相同的严格测试,该json库已经过时间测试并证明可以工作。

这一行代码就是一个3KB文件。

github上的json

于 2013-04-22T23:08:57.117 回答
0

好吧,就像你说的,你有两个选择:

  • 要么包括像 JSON2 这样的库(未压缩 17KB,所以不是很大的负担)
  • 构建自己的小解析器

然后还有第三个选项,它是潜在的安全问题,但它可能会这样做:使用 eval 来评估 json:

var json = '{"result":true,"count":1, "state":"ON"}';
obj = eval(json);
于 2013-04-22T23:11:34.743 回答
0

你可以试试json-sans-eval。它又快又小(只有 1.5Kb),但不验证您的 JSON。

于 2013-04-22T23:12:40.120 回答