JSONで配列の入れ子構造や値の取得方法などをPythonを使って説明!

みなさん、こんにちは!JSONファイルを扱うとき、ハッシュと配列の使い分けや、どの程度ネストさせていいのか、ハッシュや配列が入り混じってもいいのかなど気になっている方はいませんか?

因みにネストとは、構造が入れ子になっていることを指します。構造がより多く入れ子になっていることをネストが深くなるというので覚えておきましょう!今日はそんな方のために、JSONの配列について詳しく話していこうと思います!

目次

JSONでの配列とハッシュの違い

さて、JSONでデータを扱うときネストする方法に、配列を使うか、ハッシュを使うかという方法があります。

配列もハッシュも複数の値を管理するためのものですが、それぞれについてごっちゃになっていないか、きちんと定義していきましょう。

配列とは

まず、配列とは言語によってはリストと呼ばれたりもしますが、基本的には[]このスクエアブラケットで囲まれたものを指します。配列はインデックスと要素によって管理します。

インデックスとは配列の一つ一つに与えられた添字のことで、0から要素の終わりまで与えられます。例えば、

["apple", "banana", "melon"]

このような配列があれば0番目: apple, 1番目: banana, 2番目: melonという風に認識されます。添字は配列を用いた時点で自動で付与されます。なので基本的に、

a = ["apple", "banana", "melon"]

このように変数に格納されていた場合は、

a[0]

としてやればappleを取り出すことができます。

ハッシュとは

ハッシュとは、JavaScriptではオブジェクトなど言語によって呼び方が違いますが、概念は同じで{}このカーリーブラケットで囲まれたもののことを示します。

プログラミングを学んでいると、意味は同じだけど言語によって呼び方が違って難しく感じてしまうことなどはよくあるので、常に概念を捉えて学ぶことが大切です。ハッシュとは、keyとvalueを一セットとして扱う方法のことです。

{"name": "taro", "age": 23, "sex": "man"}

この左側がkeyで右側がvalueとなっていて、常にkeyを指定することによってvalueを呼び出します。

a = {"name": "taro", "age": 23, "sex": "man"}

このように変数に格納されていた場合基本的に、

a[“name”]

としてやることで、taroを取り出すことができます。インデックスという概念はなく、要素が増えても一意な名前(key)で情報を指定できることが特徴です。また、JSONは基本的にハッシュ構造になっています。

JSONで配列を扱う

本日は、Pythonを使ってtest.jsonからJSONを読み込み実際に配列を扱って行きます。Pythonで書いていますが、今回はPythonを使うところがミソではなく、JSONを理解することが目的なので言語に拘る必要はありません。

Pythonでのjsonの読み込み方などは、こちらの記事で解説しているのでわからない方はみてみてください。

配列の値を取り出す

さて、それでは実際にJSONに配列を含めその値を取り出してみましょう。

test.json

{
  "name": "taro",
  "age": 23,
  "sex": "man",
  "hobby": [
    "running",
    "swimming",
    "singing"
  ]
}

このようなJSONを用意しました。例えばこの中の”swimming”を取り出してみたいとしましょう。実はこれ、前章で行った配列の取り出し方とハッシュの取り出し方を合わせると対応できるのです。

import json

json_file = open('test.json', 'r')
json_object = json.load(json_file)

print(json_object["hobby"][1])
swimming

6行目をみてみましょう。

json_object["hobby"][1]

このようにして取り出していますね。json_objectという変数に格納されたJSONを[“hobby”]で趣味の配列を抜き出してその後[1]で配列の中の1番目の要素を取り出していますね。先程も上げましたが、配列は0から数えるを間違えないようにしてください。

配列をネストさせてみる

次は、配列をネストさせてみましょう。

test.json

{
  "name": "taro",
  "age": 23,
  "sex": "man",
  "hobby": [["running","swimming", "fising"], ["movie", "game", "card"]]
}

このようJSONを用意しました。2次元配列と言うやつですね。これは、配列の中の1つ目の配列がインデックス0、2つの目の配列がインデックス1となり、その中の要素それぞれに、さらにインデックスがついています。

ネストされた値を取り出す

それでは、また”swimming”を取り出してみましょう。

import json

json_file = open('test.json', 'r')
json_object = json.load(json_file)

print(json_object["hobby"][0][1])
json_object["hobby"][0][1]
swimming

keyが”hobby”の0番目の配列の1番目の要素という風に指定してやれば良いですね。このように、どんな複雑なものでもひとつずつ指定してやればどんなものにも対応することができます。

配列とハッシュを混ぜてみる

では最後に配列とハッシュが入れ混ざったものをみていきましょう。以前までのものも入れ混ざっていたのですが、もっと複雑なものをみていきます。

{
  "name": "taro",
  "age": 23,
  "sex": "man",
  "hobby": {
    "outdoor": {
      "land": ["running", "walking"],
      "sea": ["swimming", "fising"]
    },
    "indoor": ["movie", "game", "card"]
  }
}

結構ネストが深く複雑になっていますね。

混ぜられた値を取り出す

しかし今まで通り順を追ってやっていけば問題ありません。次の例では”walking”と”indoor”の配列を取り出してみましょう。

import json

json_file = open('test.json', 'r')
json_object = json.load(json_file)

print(json_object["hobby"]["outdoor"]["land"][1])
print(json_object["hobby"]["indoor"])

最後なので実行結果もみておきましょう。

waking
['movie', 'game', 'card’]

もうコードをみればなぜ抜き出せているのか分かるようなっていると思います。

まとめ

いかがでしたか。配列やハッシュのネストが深くなっていくと、心理的に難しそうに見えますが実際はこのように単純ですのでこれを機にJSONて簡単だなと思えていただければ幸いです!それでは!!

この記事を書いた人

日向徹かこよすぎか

kaikaikai8217@gmail.com

目次