第三十二章JSON

4963 ワード

学習のポイント:1.JSON文法2.解析と序文化
前二章ではXMLの構造データについて検討しましたが、開発者はやはりこのようなミクロのデータ構造は複雑で冗長だと思います.この問題を解決するために、JSONの構造化データが現れました.JSONはJavaScriptの厳密なサブセットであり、JavaScriptのいくつかのパターンを利用して構造化データを表しています.一.JSON文法JSONとXMLタイプは、いずれも構造化されたデータ表示方式である.したがって、JSONはJavaScript独自のデータフォーマットではなく、他の多くの言語でJSONを解析して序列化することができます.JSONの文法は、3種類の値を表すことができます.1.単純値:JSONに文字列、数値、論理値、nullを表すことができます.しかし、JSONはJavaScriptの特殊値undefinedをサポートしていません.2.相手:名前の通り.3.配列:文字通り.単純値100、「Lee」の二つの量はJSONの表現方法で、一つはJSONの数値で、一つはJSONの文字列です.ブール値とnullも有効な形式です.しかし、実際の運用では、オブジェクトや配列と組み合わせる必要があります.対象JavaScript対象の字面量表示法:
var box = {
name : 'Lee',
age : 100
};
 JSONのオブジェクト表示法にはダブルクォーテーションが必要です.また、赋値演算とセミコロンは存在しません.
{
"name" : "Lee", //     ,       
"age" : 100
}
 配列JavaScript配列の字面量表示法:
var box = [100, 'Lee', true];
 JSONの配列表現法には変数の割り当てと分数がありません.
[100, "Lee", true]
                       :
[
{
"title" : "a",
"num" : 1
},
{
"title" : "b",
"num" : 2
},
{
"title" : "c",
"num" : 3
}
]
 
PS:一般的には、JSON構造データをテキストファイルに保存し、XMLHttpRequestオブジェクトを通じてそれをロードして、この構造データ文字列(XMLHttpRequestオブジェクトはAajx章で詳細に検討されます)を得ることができます.したがって,このプロセスをシミュレーションすることができる.JSONテキストファイルを読み込むデータをシミュレーションし、変数に値を割り当てます.
var box = '[{"name" : "a","age" : 1},{"name" : "b","age" : 2}]';
 PS;上の短いコードはvar box=load('demo.json')をシミュレートしました.賦課プロセスロードされたテキストファイルは、内容に関係なく文字列でなければなりません.両側に二重引用符を付けます.実はJSONは普通の配列より両側の二重引用符が多く、普通の配列は以下の通りです.
var box = [{name : 'a', age : 1},{name : 'b', age : 2}];
 二.解析と序列化JSONファイルをロードする場合、私たちはそれを使用する必要があります.JSON文字列を元のJavaScript値に解析しなければなりません.もちろん、元のJavaScriptオブジェクトや配列であれば、JSON文字列に変換することもできます.JSON文字列解析はJavaScript原生値で、初期にはeval()関数を採用しています.しかし、この方法は安全ではありません.悪意のあるコードを実行するかもしれません.
var box = '[{"name" : "a","age" : 1},{"name" : "b","age" : 2}]';
alert(box); //JSON    
var json = eval(box); //   eval()    
alert(json); //   JavaScript    
 ECMAScript 5は、JSONを解析する行為を規範化し、グローバルオブジェクトJSONを定義しています.このオブジェクトをサポートするブラウザには、IE 8+、Firefox 3.5+、Safari 4+、Chrome、Opera 10.5+があります.サポートされていないブラウザもオープンソースのjson.jsを使ってシミュレーションして実行できます.JSONオブジェクトは、元のJavaScript値をJSON文字列に変換する2つの方法を提供しています.もう一つはJSON文字列をJavaScript原生値に変換することです.パーパーパー().
var box = '[{"name" : "a","age" : 1},{"name" : "b","age" : 2}]'; //    ,      
alert(box);
var json = JSON.parse(box); //     ,   
alert(json);
var box = [{name : 'a', age : 1},{name : 'b', age : 2}]; //JavaScript    
var json = JSON.stringify(box); //    JSON    
alert(json); //     
 JSONをプログレッシブ化する過程で,stringify()法はまた第二パラメータを提供する.最初のパラメータは配列であっても良いし、結果をフィルタリングするための関数であっても良いです.二つ目のパラメータはJSON文字列にインデントを残しているかどうかを表します.
var box = [{name : 'a', age : 1, height : 177},{name : 'b', age : 2, height : 188}];
var json = JSON.stringify(box, ['name', 'age'], 4);
alert(json);
 PS:インデントを保持する必要がないなら、記入しなくてもいいです.フィルタ結果が必要でない場合は、インデントを保持します.フィルタ結果のパラメータはnullに設定されます.関数を使うと、複雑なフィルタリングができます.
var box = [{name : 'a', age : 1, height : 177},{name : 'b', age : 2, height : 188}];
var json = JSON.stringify(box, function (key, value) {
switch (key) {
case 'name' :
return 'Mr. ' + value;
case 'age' :
return value + ' ';
default :
return value;
}
}, 4);
alert(json);
 PS:字下げは普通の数字だけでなく、文字でも大丈夫です.もう一つの方法は、データをカスタマイズしてフィルタリングし、toJSON()の方法を使って、あるグループのオブジェクトの中から指定した値を返すことができます.
var box = [{name : 'a', age : 1, height : 177, toJSON : function () {
return this.name;
}},{name : 'b',age : 2, height : 188, toJSON : function () {
return this.name;
}}];
var json = JSON.stringify(box);
alert(json);
 PS:ここから分かるように、プログレッシブも実行順序があります.まずtoJSON()の方法を実行します.第二のフィルタパラメータを適用した場合、この方法を実行します.次に、キーの値を合法的なJSON文字列に構成するなど、プログレッシブプロセスを実行します.インデントが与えられたら、インデント操作を行います.JSON文字列の解析方法パース()は、JavaScript値を復元する際に、自分の欲しい値に置き換えることができます.
var box = '[{"name" : "a","age" : 1},{"name" : "b","age" : 2}]';
var json = JSON.parse(box, function (key, value) {
if (key == 'name') {
return 'Mr. ' + value;
} else {
return value;
}
});
alert(json[0].name);