js eval解析jsonを使用(jsではjsonを使用)

4956 ワード

まずevalの使い方を説明します.内容は簡単で、よく知っているのはeval関数をスキップしてパラメータsを受信することができます.sが文字列でない場合は、直接sを返します.そうでなければs文を実行します.s文の実行結果が値の場合、この値が返され、そうでなければundefinedが返されます.特に注意したいのは、オブジェクト宣言構文「{}」は値を返すことができず、カッコで囲まれて値を返す必要があります.簡単な例は次のとおりです.
 
  
var s1='"a" + 2'; //
var s2='{a:2}'; //
alert(eval(s1)); //->'a2'
alert(eval(s2)); //->undefined
alert(eval('(' + s2 + ')')); //->[object Object]

オブジェクト宣言文では、実行のみで値を返すことはできません.
一般的な「{}」のようなオブジェクト宣言文を返すには、値を返すには、カッコで囲まれた式に変換する必要があります.これもJSONを用いたAjax開発の基本原理の一つである.例では、2番目のalert文がundefinedを出力し、3番目のカッコを付けた後に出力されるのは文が表すobjectオブジェクトであることが明らかになった.ここでは、関数内でグローバルコードを実行する方法に重点を置きます.この問題を説明するために、まず例を見てみましょう.
 
  
var s='global'; //
function demo1(){
    eval('var s="local"');
}
demo1();
alert(s); //->global

上のdemo 1関数はfunction demo 1(){var s='local';},ローカル変数sが定義されています.だから最後の出力はglobalで変なことではありません.結局、局所変数とグローバル変数をはっきり区別することができます.よく理解すると、eval関数の特徴は、常に呼び出されたコンテキスト変数空間(パッケージ、closureとも呼ばれる)内で実行され、変数定義も関数定義も同様であるため、次のコードは関数が定義されていないエラーを発生します.
 
  
var s='function test(){return 1;}'; //
function demo2(){
    eval(s);
}
demo2();
alert(test()); //->error:test is not defined

これはtest関数が局所空間で定義されているため,demo 2関数内にアクセスでき,外にはアクセスできない.
共有:JsのevalでJSONの中の注意点を解析してJSの中でJSONの文字列をJSONのデータフォーマットに解析して、普通は2種類の方式があります:
1.eval()関数を使用する.
2.Functionオブジェクトを使用して、戻り解析を行います.
eval関数を用いて解析し,jqueryのeachメソッドを用いて遍歴した.
JSONデータをjqueryで解析する方法では、jquery非同期リクエストの転送対象として、jqueryリクエスト後に返される結果がjsonオブジェクトであるが、ここではサーバがJSON形式の文字列を返す形式を考慮し、JSOnObjectなどのプラグインでカプセル化されたJSONオブジェクトについても、これと大同小異であり、ここでは説明しない.ここではまずJSON文字列セットを示し、文字列セットは以下の通りである.
 
  
var data="
{
root:
[
{name:'1',value:'0'},
{name:'6101',value:' '},
{name:'6102',value:' '},
{name:'6103',value:' '},
{name:'6104',value:' '},
{name:'6105',value:' '},
{name:'6106',value:' '},
{name:'6107',value:' '},
{name:'6108',value:' '},
{name:'6109',value:' '},
{name:'6110',value:' '}
]
}";

ここでは,jqueryが非同期で取得したデータ型であるjsonオブジェクトと文字列に基づいて,それぞれ2つの方式で取得した結果処理方式を紹介する.
1.サーバから返されるJSON文字列について、jquery非同期要求がタイプの説明をしていないか、文字列で受け入れられている場合は、オブジェクト化処理を行う必要があります.あまり面倒ではありません.eval()にその文字列を置いて実行します.この方法は、通常のjavascipt方式でjsonオブジェクトを取得するのにも適しています.以下に例を示します.
var dataObj=eval("("+data+")");//jsonオブジェクトに変換
なぜevalここに「(」+data+");//」を追加するのですか?
なぜならeval自体の問題です.Jsonは「{}」で開始および終了するため、JSでは文ブロックとして扱われるため、強制的に式に変換する必要がある.
カッコ付けの目的は、eval関数がJavaScriptコードを処理するときにカッコ内の式(expression)を文(statement)として実行するのではなく、オブジェクトに強制的に変換することです.例として、オブジェクトの字面量{}外部カッコを付けない場合、evalはカッコをJavaScriptコードブロックの開始と終了フラグとして認識し、{}は空の文を実行したとみなされます.次の2つの実行結果は異なります.
 
  
alert(eval("{}"); // return undefined
alert(eval("({})");// return object[Object]

この書き方に対して、JSでは、あちこちで見ることができます.
例:(function(){}();閉パッケージ操作をする場合など.
 
  
alert(dataObj.root.length);// root
$.each(dataObj.root,fucntion(idx,item){
if(idx==0){
return true;
}
// root
alert("name:"+item.name+",value:"+item.value);
})

注意:一般的なjsに対してjsonオブジェクトを生成するには、$のみが必要です.each()メソッドはfor文に置き換えればよいが,その他は変わらない.
2.サーバから返されるJSON文字列について、jquery非同期要求がtype(一般的にこの構成属性)を「json」に設定したり、$.getJSON()メソッドでサーバから返されたりした場合、では、eval()メソッドは必要ありません.この場合に得られる結果はすでにjsonオブジェクトであるため、そのオブジェクトを直接呼び出すだけでよいので、ここでは$.getJSONメソッドを例にデータ処理方法を説明します.
 
  
$.getJSON("http://www.xx.cn/",{param:"gaoyusi"},function(data){
// data json
//
$.each(data.root,function(idx,item){
if(idx==0){
return true;// countinue, false break
}
alert("name:"+item.name+",value:"+item.value);
});
});

ここで特に注意しなければならないのは、方式1のeval()メソッドは、文字列(jsスクリプトかもしれない)を動的に実行することで、システムのセキュリティ上の問題を引き起こしやすいので、eval()を回避したサードパーティクライアントスクリプトライブラリ、例えばJSON in JavaScriptは、3 kを超えないスクリプトライブラリを提供することができる.
第2の解析方式はFunctionオブジェクトを用いて行うものであり,その典型的な応用はJQUERYにおけるAJAXメソッドにおけるsuccessなどの戻りデータdataに対する解析である.
 
  
var json='{"name":"CJ","age":18}';

data =(new Function("","return "+json))();


このときのdataはjsonオブジェクトに解析されます