JavaScript JSON——「文法、解析と序文化」の注意点

6428 ワード

構文
JSONは三つのタイプの値を表してもいいです.
  • 単純値:jsと同じ文法を使用して、jsonに文字列、数値、ブール値、nullを表すことができます.しかし、jsonはjsのundefinedをサポートしていません.
  • オブジェクト:オブジェクトは複雑なデータタイプとして、順序正しいキーパッドペアのセットを表しています.各キー値ペアの値は、単純な値であっても良いし、複雑なデータタイプの値
  • であっても良い.
  • 配列:配列は複雑なデータタイプであり、順序正しい値リストのセットを表し、数値インデックスによってその値にアクセスできる.配列の値は、任意の種類、単純な値、オブジェクト、配列のいずれでもよい.
  • Jsonは変数、関数、オブジェクトの例をサポートしていません.構造データを表す形式です.
    単純値
    js文字列とjsonの最大の違いは、json文字列はダブルクォーテーションを使用しなければならず、シングルクォーテーションマークは文法的なエラーを引き起こすということです.
    オブジェクト
    jsのオブジェクト:
    var person = {
        name: "oliver",
        age:29
    };
    
    ただし、JSONにはダブルクォーテーションが必要です.
    {
        "name": "oliver",
        "age": 29
    }
    
    そして変数を宣言しませんでした.末尾のセミコロンがありません.同じオブジェクトの中に同名の属性が2つ現れてはいけません.
    行列
    jsの配列:
    var values = [321,"Oliver",false]
    
    JSONの配列:
    [321,"Oliver",false]
    
    JSONには変数とセミコロンがありません.
    解析と序列化
    JSONオブジェクト
    jsonの流行の一番の原因はjsonのデータ構造がjsの対象と解析できるからです.初期のjson解像度は基本的にjsのeval関数を使用しています.以前のバージョンのブラウザでは、shimを使用できます.https://github.com/douglacrockford/JSON-js.JSON解析を生でサポートできないブラウザには、シムを使うのがベストです.ECMAScript 5は、JSONを解析する行為を規範化し、グローバルオブジェクトJSONを定義しています.
    JSONオブジェクトには2つの方法があります.
  • stringify()
  • parse()
  • 最も簡単な場合、この2つの方法は、javascriptオブジェクトをJSON文字列に順序付け、JSON文字列を元の音として解析するjavascript値に使用される.
    例えば(JSON.strigify():
    var book = {
        title: "javascript",
        authors: ["oliver", "troy"],
        edition: 2,
        year: 2000,
        other: undefined //   
    };
    
    var jsontext = JSON.stringify(book);
    
    console.log(jsontext); //{"title":"javascript","authors":["oliver","troy"],"edition":2,"year":2000}
    
    また(JSON.parse()のようです.
    var anotherBook = JSON.parse(jsontext);
    console.log(Object.keys(anotherBook).toString()); //title,authors,edition,year
    
    プログレッシブのオプションJSON.stringify()は、プロビジョニングされるJavascriptオブジェクトに加えて、他の2つのパラメータを受信することができ、この2つのパラメータは、異なる方法でjavascriptオブジェクトをプロビジョニングするために使用される.
    最初のパラメータはフィルタです.行列でもいいし、関数でもいいです.
    2番目のパラメータはJSON文字列にインデントを保持するかどうかを示すオプションです.これらの二つのパラメータを単独または組合せで使用すると,JSONの逐次的な制御が可能になる.
    フィルタ結果JSON.stringify()の2番目のパラメータが1つの配列であるとき.戻りの結果には、これらの属性のみが含まれます.
    var book = {
        title: "javascript",
        authors: ["oliver", "troy"],
        edition: 2,
        year: 2000,
        other: undefined //   
    };
    var jsontext = JSON.stringify(book,["title","authors"]);
    console.log(jsontext); //{"title":"javascript","authors":["oliver","troy"]}
    
    2番目のパラメータが関数である場合、入力された関数は2つのパラメータ、属性名、属性値を受信する.
    属性名によって、プログレッシブされたオブジェクトの属性はどのように処理されるべきかが分かります.属性名は文字列しかできません.キーの値が構造の値ではない場合は、キー名は空の文字列となります.プログレッシブオブジェクトの結果を変更するために、関数の戻り値が対応するキーの値です.undefinedを属性値として返すと、この属性はスキップされることを表します.
    例えば:
    var book = {
        title: "javascript",
        authors: ["oliver", "troy"],
        edition: 2,
        year: 2000,
        other: undefined //   
    };
    var jsontext = JSON.stringify(book,function (key,value) {
        switch (key) {
            case "authors":
                return value.join("-");
                break;
            case "edition":
                return undefined;
                break;
            default:
                return value;
        }
    });
    console.log(jsontext); //{"title":"javascript","authors":"oliver-troy","year":2000}
    
    文字列のインデント
    JSON.strigify()の3番目のパラメータが制御結果のインデントと空白です.このパラメータが数値の場合、各レベルのインデントの空欄数を表します.
    var book = {
        title: "javascript",
        authors: ["oliver", "troy"],
        edition: 2,
        year: 2000,
        other: undefined //   
    };
    var jsonText = JSON.stringify(book,null,4);
    var pre = document.getElementById("pre");
    pre.innerHTML = jsonText;
    // {
    //     "title": "javascript",
    //     "authors": [
    //         "oliver",
    //         "troy"
    //     ],
    //     "edition": 2,
    //     "year": 2000
    // }
    
    最大の字下げスペースの数は10で、10を超えると10に設定されます.
    インデント文字列が数値ではなく文字列である場合、この文字列はJSON文字列でインデント文字として使用されます.字下げ文字列は最大でも10文字の長さしか現れません.
    var book = {
        title: "javascript",
        authors: ["oliver", "troy"],
        edition: 2,
        year: 2000,
        other: undefined //   
    };
    var jsonText = JSON.stringify(book,null,"----");
    var pre = document.getElementById("pre");
    pre.innerHTML = jsonText;
    // {
    // ----"title": "javascript",
    // ----"authors": [
    // --------"oliver",
    // --------"troy"
    // ----],
    // ----"edition": 2,
    // ----"year": 2000
    // }
    
    toJSON()方法
    トJSON()メソッドは、オブジェクト全体のプログレッシブデータではなく、指定されたデータを返すためにプログレッシブ化されたオブジェクトに追加されます.
    toJSON()法は関数フィルタとして補足できるので,逐次内部秩序を理解することが重要である.一つのオブジェクトをJSON.strigifyに導入すると仮定すると、そのオブジェクトの順序は以下の通りである.
  • toJSON()方法があり、有効な値が得られる場合、この方法を起動する.デフォルトの順序で順序付けを実行します.
  • は、第二のパラメータが提供される場合、この関数フィルタを適用する.着信関数フィルタの値は、第1ステップの戻り値です.
  • は、第2のステップで返された各値に対応する順序付け
  • を行う.
  • 第3のパラメータが提供されると、対応するフォーマット
  • が実行される.
    例えば:
    var book = {
        title: "javascript",
        authors: ["oliver", "troy"],
        edition: 2,
        year: 2000,
        toJSON: function () {
            return this.title + this.edition; //javascript2
        },
        other: undefined //   
    };
    var jsonText = JSON.stringify(book);
    console.log(jsonText); //javascript2
    
    解析オプションJSON.parse()方法は、キーの各ペア上で呼び出される別のパラメータを受信することもできる.
    この関数は還元関数と呼ばれています.JSON.strigify()法のフィルタ関数と似ています.キーパッドのペアを受信して、値を返します.還元関数がundefinedに戻ると、結果から該当するキーを削除することを表し、他の値を返したらその値を結果に挿入します.
    var book = {
        title: "javascript",
        authors: ["oliver", "troy"],
        edition: 2,
        year: 2000,
        date: new Date(2001, 1, 1),
        other: undefined //   
    };
    var jsonText = JSON.stringify(book);
    console.log(jsonText); //{"title":"javascript","authors":["oliver","troy"],"edition":2,"year":2000,"date":"2001-01-31T16:00:00.000Z"}
    var anotherbook = JSON.parse(jsonText, function(key, value) {
        switch (key) {
            case "date":
                return new Date(value);
                break;
            default:
                return value;
                break;
        }
    })