2017/12 JSON入門

JSONとは

フォーマット

概要

{
    "name": "山田太郎",
    "age": 22,
    "pet": false,
    "school": ["小学校", "中学校", "高校", "大学"],
    "parents": [
        {
            "name": "山田一郎",
            "age": 52
        },{
            "name": "山田花子",
            "age": 50
        }
    ]
}

このように左の「キー」、右の「各種データ」をつなげてデータを記述します。 この例では個人情報を記述しています。「キー」を見ていくとなんとなく内容が見えてくると思います。

各種データの型

{
    "数値": 123,
    "文字列": "もじ",
    "真値": true,
    "偽値": false,
    "配列": [1, 2, 3],
    "null": null,
    "オブジェクト": {
        "name": "山田一郎",
        "age": 52
    }
}

数値、文字列、真偽値、配列、null、オブジェクトの6つの型を利用できます。 コメントは書けません。

配列

{
    "数値": [1, 2, 3],
    "オブジェクト": [
        {
            "name": "山田一郎",
            "age": "52"
        },{
            "name": "山田花子",
            "age": "50"
        }
    ],
    "配列": [
        [1, 2, 3],
        [2016, 2017, 2018],
        [22, 52, 55]
    ]
}

配列の中には、数値を入れることも、オブジェクトを入れることも、配列の中に配列を入れることもできます。

階層を掘って関連性を表現

{
    "name": "山田太郎",
    "smartphone": {
        "kind": "iphone",
        "company": {
            "name": "apple",
            "country": "America"
        }
    }
}

JSONはデータを並べるだけではありません。 このように個人(1層)->スマートフォン(2層)->会社(3層)と階層を掘り下げ繋げることで、個人の持っているスマホのメーカーを表現できます。

Tips

データの関連性

{
    "user": "山田太郎",
    "name": "photo.png",
    "size": 500,
    "imageWidth": 300,
    "imageHeight": 200,
    "imageType": "png",
}

写真のデータを上記のような形でついつい横並びにデータを並べしまうことがよくあります。しかし、下記のように画像データは画像データとして、オブジェクトにまとめることがおすすめです。まとめられるものはまとめておくことが、半年後、1年後にメンテナンスするときの助けになるでしょう。

{
    "user": "山田太郎",
    "image": {
        "name": "photo.png",
        "size": 500,
        "width": 300,
        "height": 200,
        "type": "png"
    }
}

配列とオブジェクト

{
    "users": "山田太郎",
    "goods": [
        {
            "item": "wallet",
            "price": 10000,
            "old": 2
        },{
            "item": "watch",
            "price": 20000,
            "old": 4
        },{
            "item": "glasses",
            "price": 8000,
            "old": 1
        }
    ]
}

// javascript
const wallet = data.goods.find((element)=>{
    return element.item == "wallet"
});

ユーザの持ち物を表現するのに、上記のように持ち物を配列で表現することができます。 しかし、下記のように持ち物をオブジェクトで表現することもできます。

{
    "users": "山田太郎",
    "goods": {
        "wallet": {
            "price": 10000,
            "old": 2
        },
        "watch": {
            "price": 20000,
            "old": 4
        },
        "glasses": {
            "price": 8000,
            "old": 1
        },
    }
}

// javascript
const wallet = data.goods.wallet;

どう使い分ける?

むやみにデータを配列に入れ込む設計ではなく、ソート順番を表現したい場合は配列を使い、それ以外のときはオブジェクトで設計したほうがよいと思います。