JS地道に——2つの内蔵オブジェクト——[2]JSONオブジェクト
JSONの3つの理解について:
JSONはJSの厳密なサブセットであり、JSの2つの内蔵オブジェクトの1つである(ES 5はグローバルオブジェクトJSONを定義している).
JSのいくつかのモードを利用して構造化データを表し、JSONはプログラミング言語ではなくデータフォーマットである.
注目すべきはJSONはJSに従属していないことであり、JSONだけがJSONを使用するわけではない.多くの言語ではJSONに対して解析器とシーケンス化器がある.
JSONの文法:
JSONの構文は、次の3種類の値を表すことができます.
JSONの文法はJSの文法の中にあることを支持しません:
以下は有効なJSONデータです.
5
"Hello world!"
true
null
二、末尾のセミコロンがない.
三、JSONオブジェクトの属性は二重引用符を付けなければならない.
{
"firstName":"Qingke",
"lastName":"Zhao"
}
二、JSON配列にはセミコロンがない.
[1,"string",true,[2,4],{"name":"zhaobiyang"}]
JSONオブジェクトのAPI——解析とシーケンス化
JSONオブジェクトには2つの方法があります:stringify()&&parse()
一、stringify()
JSONオブジェクトをJSON文字列にシーケンス化するには、3つのパラメータがあり、1番目のパラメータはシーケンス化されたオブジェクトで、2番目のパラメータはフィルタで、3番目のパラメータはオプションです.
1.2番目のパラメータ(フィルタ):配列であってもよいし、関数であってもよい.
a、配列:配列であればJSON.stringify()の結果には、配列にリストされている属性のみが含まれます.
var book={
"title":"JavaScript",
"authors":[
"ZhaoBiyang"
],
year:2018
}
var jsonText=JSON.stringify(book,["authors","year"]);
console.log(jsonText);//{"authors":["ZhaoBiyang"],"year":2018}
b、関数:関数の場合、関数は2つのパラメータ、属性名(キー)と属性値(値)を受信し、属性名は文字列でなければならないが、値がキー値対児構造の値ではない場合、キー名は空の文字列であってもよい.関数が返す値は、対応するキーの値ですが、関数がundefinedを返すと、対応する属性は無視されます(属性を削除します).
var book={
"title":"JavaScript",
"authors":[
"ZhaoBiyang","changshanshan"
],
edition:3,
year:2018,
name:function(){
alert("ok")
}
}
var jsonText=JSON.stringify(book,function(key,value){
switch(key){
case "authors":
return value.join(",");
case "year":
return 1992;
case "edition":
return undefined;
default:
return value;
}
});
2、3番目のパラメータ(文字列のインデント):
a、このパラメータが数値である場合、各レベルのインデントの空の数を表し、有効なインデントを制御するパラメータ値が入力されると、結果文字列には改行文字が含まれます(インデントだけで改行しない意味はありません).最大インデントスペース数は10で、10より大きい値はすべて10に変換されます.
b、パラメータが数値ではなく文字列であれば、この文字列はJSON文字列でインデント文字として使用され、10文字を超えることはできません.超えると、最初の10文字しか表示されません.
var book={
"title":"JavaScript",
"authors":[
"ZhaoBiyang","changshanshan"
],
edition:3,
year:2018,
name:function(){
alert("ok")
}
}
var jsonText=JSON.stringify(book,null,"--");
/*
jsonText :
{
--"title":"JavaScript",
--"authors":[
----"zhaobiyang","changshanshan"
--],
--"edition":3,
--"year":2018
}
*/
3、toJSON()方法:
場合によってはJSON.stringify()はシーケンス化の要件を満たすことができず、シーケンス化するオブジェクトにtoJSON()メソッドを定義し、それ自体のJSONデータフォーマットを返すことができ、元のDateオブジェクトにはtoJSON()メソッドがあり、ISO 8601日付文字列を返す(DateオブジェクトでtoISO String()を呼び出す結果と全く同じ).
任意のオブジェクトに対してtoJSON()メソッドを追加できます.
var book={
"title":"zhao",
"name":"beyond",
toJSON:function(){
return this.name;
}
}
var jsonText=JSON.stringify(book);
console.log(jsonText)
/*
"beyond"
*/
toJSON()メソッドに任意の値を返すことができ、彼は正常に動作します.たとえば、このメソッドをundefinedに戻すことができます.この場合、そのオブジェクトが別のオブジェクトに含まれている場合、そのオブジェクトがnullになります.トップオブジェクトの場合、値はundefinedになります.
toJSON()は関数フィルタの補完として利用できるため,シーケンス化の内部順序を理解することが重要である.オブジェクトをJSONに転送するとします.stringify()で、オブジェクトをシーケンス化する順序は次のとおりです.
(1)toJSON()メソッドが存在し、有効な値を返すことができる場合に呼び出す.そうでなければ、オブジェクト自体を返します.
(2)2番目のパラメータが指定されている場合、この関数フィルタを適用し、入力関数の値は(1)ステップの戻り値である.
(3)(2)で返される各値を対応するシーケンス化する.
(4)3番目のパラメータがある場合は、対応するフォーマットを実行します.
二、parse()
JSON文字列を元のJS値に解析するために使用します.2つのパラメータがあり、1つ目のパラメータはJSON文字列、2つ目のオプションパラメータはリストア関数であり、シーケンス化されたフィルタ関数と同様に、リストア関数に入力されたパラメータは1つのキーと1つの値であり、いずれも1つの値を返す必要があります.
リストア関数がundefinedを返すと、結果から適切なキーを削除することを示します.他の値を返すと、その値が結果に挿入されます.日付文字列をDateオブジェクトに変換する際には、復元関数がよく使用されます.例:
var book={
"title":"JavaScript",
"authors":[
"nick","lining"
],
edition:3,
year:2011,
releaseDate:new Date(2011,11,1)
}
var jsonText=JSON.stringify(book);
var bookCopy=JSON.parse(jsonText,function(key,value){
if(key=="releaseDate"){
return new Date(value)
} else {
return value;
}
})
console.log(bookCopy);
//{title: "JavaScript", authors: Array(2), edition: 3, year: 2011, releaseDate: Thu Dec 01 2011 00:00:00 GMT+0800 ( )}
ようこそ...