ホームページ  >  記事  >  ウェブフロントエンド  >  JSON.parse()、JSON.stringify()、および eval() の関数の詳細な分析_javascript スキル

JSON.parse()、JSON.stringify()、および eval() の関数の詳細な分析_javascript スキル

WBOY
WBOYオリジナル
2016-05-16 15:06:471915ブラウズ

「JSON (JavaScript Object Notation) は軽量のデータ交換形式です。ECMAScript のサブセットに基づいています。言語に依存しないテキスト形式を使用するため、C 言語ファミリーと同様の習慣も使用しており、次のような特徴があります。この特性により、JSON は人間にとって読み書きが容易で、機械にとっても解析と生成が容易な (通常、ネットワークの送信速度を向上させるために使用される) 理想的なデータ交換言語となっています。

今日は jquery の JSON.parse() 関数と JSON.stringify() 関数について簡単に説明したいと思います。ちなみに、ネイティブ JS の eval() 関数についても触れておきます。

(1) JSON.parse 関数 機能: JavaScript Object Notation (JSON) 文字列をオブジェクトに変換します。

構文: JSON.parse(text [, reviver])

パラメータ:

テキスト 必須。 有効な JSON 文字列。


リバイバー オプション。 結果を変換する関数。 この関数は、オブジェクトのメンバーごとに呼び出されます。

戻り値: オブジェクトまたは配列


例:

var json = '{"name":"GDT","age":,"University":"GDUT"}';
var info = JSON.parse(json);  //解析为JSON对象
document.write(info.name + ' is a student of ' + info.University + ' and he is ' + info.age + " years old."); /info为Object对象

(2) JSON.stringify() 関数 関数: JavaScript 値を JavaScript Object Notation (JSON) 文字列に変換します

構文: JSON.stringify( value [, replacer] [, space])

パラメータ:

value 必須。通常は変換する必要がある JavaScript 値 (通常はオブジェクトまたは配列)


replacer オプション、結果の変換に使用される関数または配列


スペース オプション。戻り値の JSON テキストにインデント、スペース、改行を追加して読みやすくします。


戻り値: JSON テキストを含む文字列

例:

var info = {name:"GDT",age:,University:"GDUT"};
var json = JSON.stringify(info); //转换为JSON字符串
document.write(json); //output为{"name":"GDT","age":23,"University":"GDUT"}

(3) eval() 関数 関数: eval() 関数は文字列を計算し、その中の JavaScript コードを実行できます。

構文: eval(string)

パラメータ:

string 必須。評価される JavaScript 式または実行されるステートメントを含む、評価される文字列。


戻り値: 計算された文字列の値があれば、その値を返します (存在しない場合は、変更せずに返します)

例:

eval("x=;y=;document.write(x*y)"); //output为
document.write(eval("+"));  //output为
var x=;
document.write(eval(x+));  //output为

eval() 関数を使用して JSON 文字列をオブジェクトに解析します。この関数は JSON.parse() の関数を完了できますが、次のコードを参照してください。

// JSON.parse()
var json = '{"name":"GDT","age":,"University":"GDUT"}';
var info = JSON.parse(json);    //解析为JSON对象
document.write(info); //output为[object Object]
//eval()
var json = '{"name":"GDT","age":,"University":"GDUT"}';
var info = eval('(' + json + ')'); //解析为JSON对象
document.write(info); //output为[object Object]
eval() が文字列をラップするために一対のかっこを使用していることに気づいたかどうかはわかりませんが、これについてはもっと良い説明を見つけました:

理由:eval自体の問題によるもので、jsonは「{}」で始まり、JSではステートメントブロックとして処理されるため、強制的に式に変換する必要があります。 。


解決策: かっこを追加する目的は、JavaScript コードを処理するときに、ステートメントとして実行するのではなく、eval 関数でかっこ内の式を強制的にオブジェクトに変換することです。たとえば、オブジェクト リテラル {} を考えます。外側の大括弧が追加されていない場合、eval はその中括弧を JavaScript コード ブロックの開始マークと終了マークとして認識し、{} は空のステートメントを実行するとみなします。次の例で違いを確認してください

alert(eval("{}")); // return undefined
alert(eval('('+'{}'+')')); // return object[Object] 
さらに、厳密な記述形式の JSON.parse() と比較して、eval() は任意の文字列を解析できます。これは、eval が比較的緩く、潜在的なセキュリティ上の問題があるためです。たとえば、次のコード:

var str = '{"a":"b"}';
document.write(eval("("+str+")")); //正常解析为对象
var str = '{"a": (function(){alert("I can do something bad!");})()}';
eval('('+str+')'); //可以用来执行木马脚本 
悪意のあるユーザーがページにトロイの木馬のリンクを挿入するスクリプトを json 文字列に挿入した場合、eval を使用して操作することもできます。ただし、JSON.parse() ではこの問題を心配する必要はありません。 eval() 関数は非常に強力ですが、実際に使用する機会はそれほど多くないことがわかります。

これは私の人生初のブログです。4 月 1 日の愚者の日に誕生しました。現在の技術は非常に悪いのでご容赦ください。少しずつ知識を蓄えて、将来の成功のための良い基盤を築きましょう〜

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。