MoreBeerMorePower

Power Platform中心だけど、ノーコード/ローコード系を書いてます。

JSONと仲良くなるために (3)

JSONを読む

前回までで、JSONのルール、データ型の話をしてきました。

おさらいすると、

JSONのルール

  1. キーまたは識別子 と 値 の組み合わせで構成される
  2. キー/識別子 は ダブルクォーテーションで囲む
  3. 最初と最後は中カッコ {...} でくくる
  4. キー/識別子と値の間は コロン : で分ける
  5. 複数のキー/識別子&値のペアがあるときはカンマで区切る

JSONで取り扱うデータ型

  1. 文字列
  2. 数値
  3. ブール値
  4. オブジェクト
  5. 配列
  6. null

という感じです。

今回はサンプルをいくつか用意して、そのJSONをどう読むか/どう理解するかを考えていきたいと思います。

ここの流れを完全に理解する必要はありませんので、「ふーん」くらいで。

実際のデータを見ていく中で自分なりの筋道があればよいのだと思います。

サンプルを読んでみよう

例として以下のようなJSONを扱います。

[
    {
        "id": "0001",
        "type": "donut",
        "name": "Cake",
        "ppu": 0.55,
        "batters":
            {
                "batter":
                    [
                        { "id": "1001", "type": "Regular" },
                        { "id": "1002", "type": "Chocolate" },
                        { "id": "1003", "type": "Blueberry" },
                        { "id": "1004", "type": "Devil's Food" }
                    ]
            },
        "topping":
            [
                { "id": "5001", "type": "None" },
                { "id": "5002", "type": "Glazed" },
                { "id": "5005", "type": "Sugar" },
                { "id": "5007", "type": "Powdered Sugar" },
                { "id": "5006", "type": "Chocolate with Sprinkles" },
                { "id": "5003", "type": "Chocolate" },
                { "id": "5004", "type": "Maple" }
            ]
    },
    {
        "id": "0002",
        "type": "donut",
        "name": "Raised",
        "ppu": 0.55,
        "batters":
            {
                "batter":
                    [
                        { "id": "1001", "type": "Regular" }
                    ]
            },
        "topping":
            [
                { "id": "5001", "type": "None" },
                { "id": "5002", "type": "Glazed" },
                { "id": "5005", "type": "Sugar" },
                { "id": "5003", "type": "Chocolate" },
                { "id": "5004", "type": "Maple" }
            ]
    }
]

おそらくお菓子屋さんのメニュー&カスタマイズオプションです。

JSONは左上から辿っていくと構造が見えやすいです。

ステップ1 : まずは配列かどうか

配列かどうかはプログラム側での取り扱いが大きく変わるので、大事なポイントです。そして最も左上を見ればどっちかが分かります。

f:id:mofumofu_dance:20200904005703p:plain

サンプル1では左上が大カッコで始まっています。 データ型で紹介したように、大カッコでくくるのは配列のルールなので、このサンプルは配列だとわかります。

次は配列の件数を確認します。

配列の開始・終了である大カッコの次の階層を見てみます。(インデントされているとわかりやすい) 中カッコの開始と終了が2組入っていることが見てわかります。これにより、サンプル1のJSONはオブジェクト型の値を2件含む配列だとわかります。

この時点でイメージできるのは2行のデータを持つExcel表ですね。

f:id:mofumofu_dance:20200904010831p:plain

ステップ2 : 各データの構造 (識別子と値のデータ型)

配列でない場合にはこのステップからになります。ここでやることはオブジェクトがどのような識別子と値のペアかを理解することです。

配列の1行目のデータを取り出してみてみます。

{
    "id": "0001",
    "type": "donut",
    "name": "Cake",
    "ppu": 0.55,
    "batters":
        {
            "batter":
                [
                    { "id": "1001", "type": "Regular" },
                    { "id": "1002", "type": "Chocolate" },
                    { "id": "1003", "type": "Blueberry" },
                    { "id": "1004", "type": "Devil's Food" }
                ]
        },
    "topping":
        [
            { "id": "5001", "type": "None" },
            { "id": "5002", "type": "Glazed" },
            { "id": "5005", "type": "Sugar" },
            { "id": "5007", "type": "Powdered Sugar" },
            { "id": "5006", "type": "Chocolate with Sprinkles" },
            { "id": "5003", "type": "Chocolate" },
            { "id": "5004", "type": "Maple" }
        ]
}

JSONオブジェクトはキー/識別子と値の複数のペアで成り立っていることを思い出しましょう。

{
  "キー1" : 値1 ,
  "キー2" : 値2 
} 

すると、配列の1行目のデータは以下のような構造だとわかります。

    {
        "id": "0001",
        "type": "donut",
        "name": "Cake",
        "ppu": 0.55,
        "batters": {},
        "topping": []
    }

f:id:mofumofu_dance:20200904012337p:plain

左からインデントに沿って行くと構造が追いやすいですね。 複雑な値 (オブジェクト、配列) はいったん {...} や [...]で置き換えてみてあげましょう。

ステップ3 : さらに下の階層を読み解く

さらに次の階層、今無視した構造を読み解いていきます。 ステップ1,2を反復すれば、『識別子="batters" の値は、"batter"という識別子の列があって、その値は配列型である。』 というところまで読めるでしょうか。

追いかけ方を図示すると以下のようになります。

f:id:mofumofu_dance:20200904015258p:plain

"topping"も同様です。結局できるExcel表は下図のようになります。(かなり無理やりな形ですが)

f:id:mofumofu_dance:20200904015948p:plain

ここまでの流れは実はJSON内のデータにアクセスするときと同じ考え方です。基本は左上からインデントの順に辿っていきます。

特定の値へのアクセスは次回。