どーもTakeです。
この記事では、Python で JSON形式データの取り扱い方法について解説します!
具体的には下記項目についてです!
- JSONとは?
- JSON ファイルの読み込み
- JSON データ形式の値へのアクセス
- JSON ファイルへ書き込み
個人的に一番難しいと思うところは、「JSON データ形式の値へのアクセス」です。
たとえば、下記のようなJSONデータがあるとします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
{ "status": "OK", "geocoded_waypoints" : [ { "geocoder_status" : "OK", "place_id" : "ChIJ7cv00DwsDogRAMDACa2m4K8", "types" : [ "locality", "political" ] }, { "geocoder_status" : "OK", "place_id" : "ChIJ69Pk6jdlyIcRDqM1KDY3Fpg", "types" : [ "locality", "political" ] }, { "geocoder_status" : "OK", "place_id" : "ChIJgdL4flSKrYcRnTpP0XQSojM", "types" : [ "locality", "political" ] }, { "geocoder_status" : "OK", "place_id" : "ChIJE9on3F3HwoAR9AhGJW_fL-I", "types" : [ "locality", "political" ] } ] } |
引用元 : Google Directions API 公式ページ
上記は Google Directions API という Google の経路情報を取得できる API から取得できるデータの一部です。
仕事で「これを配列 or データにいれてくれーい」とお客さんからいわれたんですね(イヤー大変でした...)
しかしコツをつかめば、どんな複雑なデータ形式でも必ず取得できるようになります。
この記事では、そういった JSON のデータの取り扱いについてご紹介します!!
JSONとは?
JSON (JavaScript Object Notation)とは、JavaScriptのオブジェクトリテラル記法のことです。
「なんのこっちゃ」と思うかもしれませんが、こいつを使えば異なるプログラミング言語でもデータのやり取りができるんです!
これがすごく便利な特徴で、あるデータがPythonやPHP、JavaScript で読み込むことも可能です!
そのため Google やシステムトレードのなどの API で利用されています。
本当に便利なデータ形式なので、知っておいて絶対に損がない知識です!
JSON ファイルの読み込み
たとえば、下記内容の 「test.json」という JSON ファイルがあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
{ "status": "OK", "geocoded_waypoints" : [ { "geocoder_status" : "OK", "place_id" : "ChIJ7cv00DwsDogRAMDACa2m4K8", "types" : [ "locality", "political" ] }, { "geocoder_status" : "OK", "place_id" : "ChIJ69Pk6jdlyIcRDqM1KDY3Fpg", "types" : [ "locality", "political" ] }, { "geocoder_status" : "OK", "place_id" : "ChIJgdL4flSKrYcRnTpP0XQSojM", "types" : [ "locality", "political" ] }, { "geocoder_status" : "OK", "place_id" : "ChIJE9on3F3HwoAR9AhGJW_fL-I", "types" : [ "locality", "political" ] } ] } |
このJSON ファイルの読み込み方法について、下記のソースコードのようにします。
1 2 3 4 5 6 |
import json json_open = open('test.json', 'r') json_data = json.load(json_open) print(json_data) |
上記ソースコードについて順番に説明します。
- json モジュールをインポートします。
- open メソッドを用いて、test.json (JSONデータを格納しているファイル)を開き、json_open に格納します。
- その json_open を「JSON データ形式として」読み込み、 json_data に格納します。
- 最後に print メソッドで 「json_data 」を表示させます。
出力結果は下記になります。
1 |
{'status': 'OK', 'geocoded_waypoints': [{'geocoder_status': 'OK', 'place_id': 'ChIJ7cv00DwsDogRAMDACa2m4K8', 'types': ['locality', 'political']}, {'geocoder_status': 'OK', 'place_id': 'ChIJ69Pk6jdlyIcRDqM1KDY3Fpg', 'types': ['locality', 'political']}, {'geocoder_status': 'OK', 'place_id': 'ChIJgdL4flSKrYcRnTpP0XQSojM', 'types': ['locality', 'political']}, {'geocoder_status': 'OK', 'place_id': 'ChIJE9on3F3HwoAR9AhGJW_fL-I', 'types': ['locality', 'political']}]} |
JSON データ形式の値へのアクセス
たとえば、下記内容の 「test.json」という JSON ファイルがあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
{ "status": "OK", "geocoded_waypoints" : [ { "geocoder_status" : "OK", "place_id" : "ChIJ7cv00DwsDogRAMDACa2m4K8", "types" : [ "locality", "political" ] }, { "geocoder_status" : "OK", "place_id" : "ChIJ69Pk6jdlyIcRDqM1KDY3Fpg", "types" : [ "locality", "political" ] }, { "geocoder_status" : "OK", "place_id" : "ChIJgdL4flSKrYcRnTpP0XQSojM", "types" : [ "locality", "political" ] }, { "geocoder_status" : "OK", "place_id" : "ChIJE9on3F3HwoAR9AhGJW_fL-I", "types" : [ "locality", "political" ] } ] } |
上記ファイルを読み込み、各変数にアクセスする方法について説明します。
まずは簡単なところからいきます。
1 2 3 |
{ "status": "OK", } |
上記の「status」の値である「OK」にアクセスしようとする場合、下記のようにすれば OK です。
1 2 3 4 5 6 7 |
import json json_open = open('test.json', 'r') json_data = json.load(json_open) print(json_data['status']) print(json_data.get('status')) |
「status」の値である「OK」を取得するためには、
- json_data['status']
- json_data.get('status')
のどちらかの値でやれば「OK」という値が表示されます。
つぎに少しややこしいところをいきます。
下記の「geocoded_waypoints」-> geocoder_status の値「OK」を取得する場合を考えます。
1 2 3 4 5 6 |
"geocoded_waypoints" : [ { "geocoder_status" : "OK", "place_id" : "ChIJ7cv00DwsDogRAMDACa2m4K8", "types" : [ "locality", "political" ] }, |
JSON のややこしいところは括弧がめっちゃあるところだと思います。
そんなときは下記を参考にしてください。
- [] 鍵括弧 ・・・ 配列
- {} 波括弧 ・・・ 辞書型変数
geocoded_waypoints : [ { ~ } ] とは、geocoded_waypoints にさらに辞書型変数があってそれが配列で構成されていると思ってください。
ソースコードは下記になります。
1 2 3 4 5 6 7 |
import json json_open = open('test.json', 'r') json_data = json.load(json_open) print(json_data['geocoded_waypoints'][0]['geocoder_status']) print(json_data.get('geocoded_waypoints')[0].get('geocoder_status')) |
上記の[0]とは配列のインデックスです。
例えば、array[0] = apple、array[1] = banana ・・・という配列がある場合、
[0]番目の値を参照する場合、array[0] とすると思います。
これと同じ要領で、geocoded_waypoints の[0]番目の値を参照するために
geocoded_waypoints [0]とし、その値の['geocoder_status']にアクセスすれば値がとれるということです。
つまり下記どちらかの値を指定すれば値が取れます。
- json_data['geocoded_waypoints'][0]['geocoder_status']
- json_data.get('geocoded_waypoints')[0].get('geocoder_status')
JSON ファイルへ書き込み
JSON ファイルへの書き込み方法について、下記のソースコードで実施します。
1 2 3 4 5 6 7 8 9 10 11 12 |
import json human = { "human": [ {"height": "178", "weight": "100"}, {"height": "169", "weight": "50"} ] } with open("test.json", "w") as f: json.dump(human, f) |
上記は「human」という辞書型変数があり、それを「test.json」に格納した場合の処理を記述しています。
- json モジュールをインポートします。
- 「human」という辞書型変数を定義します。
- open で書き込み先のファイル「test.json」で開きます。
- json.dump メソッドをもちいて、辞書型変数「human」をファイル「test.json」に書き込みます。
最後に
いかがでしたでしょうか?
世の中には、JSON データ形式で扱われる API が様々なあります。
この記事を参考にぜひ JSON データ形式をマスターしていただければ幸いです。
ではでは。