ホームページ > 記事 > ウェブフロントエンド > IE8 ネイティブ JSON support_json
この新しいネイティブ JSON 機能により、Internet Explorer 8 を既存の AJAX アプリケーション上でより高速かつ安全に実行できるようになります。
JSON とは何ですか?
ほとんどの開発者は AJAX プログラムを開発するだけではありません。ここでいくつかの背景知識を紹介します。 JSON は、人間が判読できるシンプルなデータ交換形式であり、AJAX プログラムでは通常、サーバーと Web プログラムの間でデータを送信するときにこの形式が使用されます。
たとえば、お気に入りの Web メールから連絡先名を選択すると、連絡先情報が表示されます。サーバーから Web プログラム (ブラウザーで実行される) に送信されるデータ ストリームは次のようになります:
{
"firstName": "cyra",
"lastName": "richardson ",
"住所": {
"streetAddress": "1 Microsoft way",
"city": "レドモンド",
"state": "WA",
"postalCode ": 98052
},
"電話番号": [
"425-777-7777",
"206-777-7777"
]
}
ありがたいことに、この形式は JavaScript の構文と完全に互換性があります。現在、多くのプログラムは Javascript の eval() 関数を使用して、取得したデータを Javascript オブジェクトに変換します。 eval() の使用は安全ではなく、リソースを消費します。 eval() は、この文字列を Jscript 式に解析して実行します。 eval() に渡される文字列が改ざんされている場合、予期しないデータや、Web アプリケーションに挿入される可能性のある他人のコードが含まれている可能性があります。
現在、信頼できない JSON データをより安全に解析するために Javascript で作成されたライブラリが多数あります。 Jscript で書かれた一部のパーサー (http://www.json.org/json_parser.js) はデータに対して厳密な検証を実行し、json2、js (http://www.json.org/json2.js) などの一部のライブラリは、正規表現を使用して入力文字列を包括的にチェックし、eval() を使用してそれを迅速に解析します。理想的なソリューションは、アプリケーションをコード インジェクションから保護し、迅速に実行され、どこでも使用できるネイティブ実装です。
IE8 Jscript のネイティブ JSON
IE8 の Jscript エンジンにはすでに JSON の完全なネイティブ実装があり、ES3.1 提案作業草案に準拠しています。 http://wiki.ecmascript.org/doku.php?id=es3.1:es3.1_proposal_working_draft) に記載されている JSON サポートの互換性を維持しながら、シリアル化および逆シリアル化の速度が大幅に向上し、アドレスのセキュリティが向上します。信頼できないデータを解析しています。
API
変更またはオーバーライドできる新しい組み込みオブジェクト「JSON」を定義します。数学やその他の組み込みグローバル オブジェクトによく似ています。 JSON オブジェクトに加えて、toJSON() などの特定の関数も、Date、Number、String、および boolean オブジェクトのプロトタイプに追加されました。 JSON オブジェクトには、parse() と stringify() という 2 つのメソッドがあります。
例:
var jsObjString = "{"memberNull" : null, "memberNum" : 3, "memberStr" : "StringJSON", "memberBool" : true , "memberObj" : { "mnum" : 1, "mbool" : false}, "memberX" : {}, "memberArray" : [33, "StringTst",null,{}]";
var jsObjStringParsed = JSON.parse(jsObjString ) ;
var jsObjStringBack = JSON.stringify(jsObjStringParsed);
parse() メソッドによって生成され、stringify() メソッドを通じてシリアル化されたオブジェクトは、次のオブジェクトとまったく同じです:
var jsObjStringParsed =
{
"memberNull" : null,
"memberNum" : 3,
"memberStr" : "StringJSON",
"memberBool" : true ,
"memberObj" :
{
"mnum" : 1,
"mbool" : false
},
"memberX" : {},
"memberArray" :
]
};
json.parse(source、reviver)
json.parseメソッドは、json形式の文字列を使用します。パラメータ ソースで指定された) を使用して、Jscript オブジェクトまたは配列を生成します。
オプションのパラメーター revive は、解析時の変更を考慮するために使用されるユーザー定義関数です。結果のオブジェクトまたは配列は再帰的に走査され、各メンバーで reviver 関数が使用され、各メンバーの値が reviver の戻り値で置き換えられます。 reviver が null を返した場合、オブジェクトのメンバーは削除されます。トラバースとリバイバーへの呼び出しは、ポストオーダー トラバースで完了します。つまり、オブジェクトのすべてのメンバーが「復活」した後、オブジェクト全体も「復活」します。
reviver は主に ISO などの文字列を識別し、Date オブジェクトに変換するために使用されます。これは、Jscript には標準の日付テキスト サイズがないためです。 ES3.1 ドラフト (http://wiki.ecmascript.org/doku.php?id=es3.1: es3.1_proposal_working_draft) には、この問題を解決するために reviver 関数を使用する方法の例が含まれています。
JSON.stringify(value, replacer, space)
これがシリアル化メソッドです。 value パラメーターで指定されたオブジェクトまたは配列をパラメーターとして受け取り、JSON 形式の文字列を生成します。オブジェクトまたは配列は再帰的にアクセスされ、特定の JSON 形式にシリアル化されます。 value パラメーターに toJSON() メソッドがある場合、このメソッドは最初のフィルターとして機能し、元の値が value.toJSON(key) に置き換えられ、最終的な値がシリアル化されます。パラメータ key は文字列です (key:value) のようなオブジェクトがシリアル化される場合、キーはメンバーの名前になります。ルート オブジェクトの場合、キーは空の文字列です。
Date.prototype.toJSON() は、エスケープを必要としない文字列を生成します。これは、stringify() が変更を加えずに元の文字列を返すため、真のシリアライザーです。日付オブジェクトは toJSON() メソッドを通じてシリアル化されます。
Number.prototype.toJSON()、String.prototype.toJSON()、Boolean.prototype.toJSON() 関数は ValueOf() を返します。これらは、「var num = new Number(3.14);」のように、オブジェクトを適切にシリアル化するために使用されます。
オプションの replacer パラメーターはフィルターとして機能し、再帰的に使用されます。関数または配列を指定できます。 replacer が関数の場合、各オブジェクト メンバー key:value に対して replacer(key,value) が呼び出されます。ルート オブジェクトについては、replacer("",value) を呼び出します。 replacer が配列の場合、配列文字列である必要があります。配列の要素は、シリアル化されるメンバーの名前です。シリアル化の順序は、配列内の名前の順序に基づきます。配列をシリアル化する場合、配列置換子は無視されます。
オプションのパラメーター スペースは、出力テキストのフォーマット方法に関するもので、このパラメーターを省略した場合、出力テキストには余分なスペースが含まれません。数値の場合は、インデントの各レベルのスペースの数を指定します。文字 (「t」や「 " など) の場合は、各レベルの文字をそれらの文字でインデントします。
既存の Web ページにどのような影響がありますか?
ES3.1 JSON プロポーザルは、人気のある json2.js で使用される主な要素です。 JSON という名前も使用します。グローバル オブジェクト JSON はオーバーライドできます。ただし、これは未定義オブジェクトではなくなりました。これは、スクリプト言語に新しいキーワードを導入するのと同じです。名前を採用すると、既存のコードに影響を与える場合があります。 json2.js を使用しているページは影響を受ける可能性は低いです。ごく一部の例外を除いて、これらのページはすべて、より速く動作するだけで、引き続き通常どおり動作します。
独自の JSON オブジェクト定義を実装するページ、特に「if(!this.JSON) { JSON=...}」のようなパターンを使用して定義された JSON オブジェクトが影響を受ける可能性があります。この問題を解決するには、主に 2 つの方法があります:
1. 既存のコードを移行し、ネイティブ JSON オブジェクトを使用します
JSON 実装が json2.js のバージョンに基づいている場合は、それを移行します。これは非常に簡単です。
2. ネイティブ JSON サポートを使用しないことを決定し、既存の JSON オブジェクトを引き続き使用します。
これは、JSON 名の名前を変更するか書き換えることによって実現できます。名前の変更とは、JSON 名を使用するすべてのコードを「MyJSON」のような名前に変更することを意味します。書き換えとは、独自の JSON 定義がデフォルトのネイティブ JSON 定義を使用するすべてのコードを確実にオーバーライドすることを意味します。ほとんどの場合、条件「if(!this.JSON)」を削除するだけで機能します。
3.1 標準の影響を考慮すると、JSON という名前を使用することは、明確に定義されたインターフェイスを通じて相互運用したいという私たちの要望と一致しています。
ネイティブ JSON については話すべきことがたくさんあります。パーサーは eval() に基づいておらず、別個の実装です。これは、JSON サポート (http://wiki.ecmascript.org/doku.php?id=es3.1: json_support) によって提供される参照パーサーと同等です。また、http://www.json.org/json_parser.js と同じくらい安全で、はるかに高速に実行されます。したがって、eval() または独自の JSON ライブラリを使用する場合は、パフォーマンスの向上と安全な操作のために、IE8 のネイティブ JSON 実装をチェックしてください。