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は文字列、数値、ブール値、nullを表すことができます.
  • オブジェクト.
  • 配列.

  • JSONの文法はJSの文法の中にあることを支持しません:
  • はJSの特殊値undefinedをサポートしていません.
  • では、JSの変数、関数、またはオブジェクトインスタンスはサポートされていません.

  • 以下は有効なJSONデータです.
  • 単純値-数値
  • 5
  • 単純値-文字列
  • JSON文字列は二重引用符を使用する必要があります.一重引用符は文法エラーを引き起こします.
    "Hello world!"
  • 単純値-ブール
  • true
  • 単純値-null
  • null
  • オブジェクト
  • 一、JSONは変数の概念がないので、変数を宣言していない.
    二、末尾のセミコロンがない.
    三、JSONオブジェクトの属性は二重引用符を付けなければならない.
    {
        "firstName":"Qingke",
        "lastName":"Zhao"
    }
  • 配列
  • 一、JSON配列に変数がない;
    二、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 (      )}

    ようこそ...