blog

なぜJSONはこれほど人気があるのか?

はじめに\nJSONは軽量なデータ交換フォーマットです。JSONのサブセットをベースにしており、完全にプログラミング言語に依存しないテキスト形式を使用して、JSON文字列を格納し、JSON文字列をパー...

Dec 19, 2020 · 4 min. read
シェア

はじめに

軽量なデータ交換フォーマットです。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に変換される。

Read next

まだif elseばかり書いているのか?

テンプレートパターンと戦略パターン - 多様性ログイン\n考えるべき質問\nログインシナリオでは、ユーザー名とパスワードによるログインに加えて\n\nでは、このような要求があったとき、通常はどのように実装するのでしょうか?\n伝統的な実装\ndto\nデータ\npublic class Au

Dec 19, 2020 · 5 min read