1

javascript 変数に保存されているサーバーからテキスト応答を取得しています。この応答の形式を完全に制御できます。通常、このテキスト応答には必要な 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 をサポートしていません。この時点で、2 つの解決策が考えられます。もちろん、1 つは Jquery を使用することですが、コードをできるだけ小さくしたいので、したくありません。2 つは、jquery のような非互換性の問題を処理するjson2のようなライブラリを使用する可能性があります。しますが、同じ問題があり、そのような単純な関数にはコードが多すぎます。

したがって、応答形式を次のように変更してから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")}}})()

1行だけでドロップインして完了できます。すでに完了しているものに対して独自の構文を記述すると、プロジェクトを完成させるための他の作業を行うのに多くの時間がかかります。あなたが書くコードは、このjsonライブラリと同じ厳密なテストを受けなければなりません。

この 1 行のコードが3KBファイルです。

github の json

于 2013-04-22T23:08:57.117 に答える
0

さて、あなたが言ったように、あなたには2つの選択肢があります:

  • JSON2 のようなライブラリを含めるか (非圧縮で 17KB であるため、大きな負担にはなりません)
  • 独自の小さなパーサーを構築する

次に、潜在的なセキュリティ上の問題となる 3 番目のオプションがありますが、そうなる可能性があります: 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 に答える