はじめに
軽量なデータ交換フォーマットです。JSONは サブセットをベースにしており、完全にプログラミング言語に依存しないテキスト形式を使ってデータを保存し、表現します。JSONはシンプルで階層が明確なため、データ交換に理想的な言語です。 人が読んだり書いたりしやすいだけでなく、機械が解析したり生成したりするのも簡単で、ネットワーク伝送効率を効果的に向上させます。
JSONはデータフォーマットであり、プログラミング言語ではありません。
JavaScriptのオブジェクト形式と似ていますが、異なる点があります。 JSON文字列は引用符で囲む必要があります。
JSONのオブジェクトは、属性を二重引用符で囲む必要があります。
JSONとjsのオブジェクトリテラルや配列リテラルを比較すると、変数を宣言する概念がなく、最後にセミコロンがありません。
JSON 値のタイプとは?
- 単純な値:文字列、数値、ブール値、null、undefinedはサポートされていません。
- Object: 複雑なデータ型として、キーと値のペアの順序付けされていないセットを表します。
- 配列:複合データ型として、値の順序付きリストを表します。
なぜJavaScriptではJSONが人気なのでしょうか?
JSONがJSで人気がある主な理由は、JSと構文が似ていることを除けば、JSONデータを有用なJSオブジェクトにパースできるからです。
初期のJSONパーサーは、基本的にJSのeval()関数を使用して、JSオブジェクトや配列を解析していました。
JSONを解析する動作はEMACScript5で標準化されており、グローバルなJSONオブジェクトが定義されています。
XMLとの比較
可読性
JSONとXMLの可読性はよく似ており、一方はシンプルな構文、もう一方は標準化されたタグで、違いを見分けるのは困難です。
拡張性
XMLはもともと非常に拡張性が高く、JSONも同様です。 XMLが拡張できて、JSONが拡張できないものはありません。しかし、JSONはJavascriptのホームグラウンドでプレーしており、Javascriptの複合オブジェクトを格納することができます。
コーディングの難易度
XMLにはDom4jやJDomなどのエンコーディングツールが豊富にあり、JSONにもツールが用意されています。ツールがなくても、熟練した開発者であれば、目的のxml文書やJSON文字列をできるだけ早く書くことができると思いますが、xml文書は構造文字が多くなります。
デコードの難易度
XMLは2つの方法で解析できます:
一つは、タグのセットのうち、親タグのインデックスを介して、つまり、ドキュメントモデルのパースです。例えば:xmlData.getElementsByTagName("tagName")が、これは、ドキュメントの構造の事前知識の場合に使用することですが、一般的なカプセル化することはできません。
もう1つのアプローチは、ノードをトラバースすることです。これは再帰によって実行できますが、パースされたデータの形式はまださまざまで、事前要件を満たしていないことがよくあります。
JSON オブジェクトメソッド
- JSON.stringify():JSONオブジェクトをJSON文字列にシリアライズします。
- デフォルトでは、スペース文字やインデントを含まないJSON文字列が出力されます。
- 直列化するオブジェクトに加えて、2つの引数を取ることができます。最初の引数はフィルターで、配列や関数にすることができます。
- JSON.parse():JSON文字列をネイティブJS値にパースします。
var pig = {
name:"花",
age:1,
weight:undefined,
height:null,
say:function(){ console.log(1); }
}
var arr = [1,"a","b",null,undefined]; // undefined値はnullに変換される。
# オブジェクトのシリアライズ>
var pigStr = JSON.stringify(pig);
// pigStr: "{"name":"花","age":1,"height":null}"
# 配列のシリアライズ>
var arrStr = JSON.stringify(arr);
// arrStr: "[1,"a","b",null,null]"
# シリアライズフィルタリング>
var book = {
title:"フロントエンド初心者から入門者まで ",
author:"フロントエンドマスターマインド",
year:2000
}
var bookStr = JSON.stringify(book,["title","author"]);
// bookStr: "{"title":"フロントエンド初心者から入門者まで ","author":"フロントエンドマスターマインド"}" year フィールドはフィルタリングされる
var bookStr2 = JSON.stringify(book,(key,value)=>{
if(key === "title"){
value = "フロントエンドの始まりから放棄まで"
}
return value
});
// bookStr2: "{"title":"フロントエンドの始まりから放棄まで","author":"フロントエンドマスターマインド","year":2000}"
# JSON.parse():JSON文字列をネイティブなJS値にパースする。>
var bookStr3 = JSON.stringify(book,null,4);
// bookStr3:
// "{
// "title": "フロントエンド初心者から入門者まで ",
// "author": "フロントエンドマスターマインド",
// "year": 2000
// }"
var bookStr4 = JSON.stringify(book,null,"--");
// bookStr4:
// "{
// --"title": "フロントエンド初心者から入門者まで ",
// --"author": "フロントエンドマスターマインド",
// --"year": 2000
// }"
// インデントされた文字列の最大長は10文字以内である。それ以上長い場合は、最初の10文字だけが結果に表示される。
# 構文解析> JS
var pigParse = JSON.parse(pigStr);
// pigParse: {name: "花", age: 1, height: null}
# 構文解析> JS
var arrParse = JSON.parse(arrStr);
// arrParse: [1, "a", "b", null, null]
#
# JSオブジェクトや配列を文字列に直列化する場合、オブジェクト内のundefinedはフィルタリングされ、配列内のundefinedはnullに変換される。