<目次>
(1) PythonでJSON形式データの値を取得する手順について
(1-1) サンプル①:ローカルのJSONファイルの読み込み(単純構造)
(1-2) サンプル②:ローカルのJSONファイルの読み込み(ネスト構造)
(1-3) サンプル③:APIコールのレスポンス結果(JSON)の値取得(Pandasなし)
(1) PythonでJSON形式データの値を取得する手順について
本記事ではPythonを使って、JSON形式のデータから値を取得するためのサンプルプログラムを2通りご紹介します。
(1-1) サンプル①:ローカルのJSONファイルの読み込み(単純構造)
{
"address1": ["神奈川県"],
"address2": ["横浜市神奈川区"],
"address3": ["羽沢南"],
"kana1": ["カナガワケン"],
"kana2": ["ヨコハマシカナガワク"],
"kana3": ["ハザワミナミ"],
"prefcode": ["14"],
"zipcode": ["2210866"]
}
import json
import pandas as pd
def parse_json_pandas_main():
# JSON形式のデータの保存パス
path = r"C:\dev\Python\00_LocalPythonApp\Sample_JsonParse\TestData\TestData_After.json"
# JSONライブラリを用いて、JSONファイルのデータをJSONオブジェクトとしてロード
df = pd.read_json(path)
print(df)
if __name__ == "__main__":
parse_json_pandas_main()
address1 address2 address3 kana1 kana2 kana3 prefcode zipcode 0 神奈川県 横浜市神奈川区 羽沢南 カナガワケン ヨコハマシカナガワク ハザワミナミ 14 2210866
(1-2) サンプル②:ローカルのJSONファイルの読み込み(ネスト構造)
{
"school_name": "Rainbow小学校",
"class": "1年生",
"students": [
{
"id": "ST001",
"name": "太郎",
"math": 84,
"physics": 74,
"chemistry": 64
},
{
"id": "ST002",
"name": "次郎",
"math": 98,
"physics": 36,
"chemistry": 84
},
{
"id": "ST003",
"name": "三郎",
"math": 87,
"physics": 65,
"chemistry": 76
}]
}
import json
import pandas as pd
def parse_json_pandas_main():
# JSON形式のデータの保存パス
path = r"[ご自身のテストデータのパス]\XXXX.json"
# JSONライブラリを用いて、JSONファイルのデータをJSONオブジェクトとしてロード
with open(path,'r',encoding='utf-8', errors='ignore') as f:
json_object = json.loads(f.read())
# pandasの「json_normalize」関数を用いてデータを正規化
# 第1引数:json形式のオブジェクト
# 第2引数:分解対象のデータのkey
# 第3引数:その他、分解した明細に付与するデータ
df = pd.json_normalize(json_object, record_path =['students'],meta=['school_name', 'class'])
print (df)
# if __name__ == "__main__":
# main()
id name math physics chemistry school_name class 0 ST001 太郎 84 74 64 Rainbow小学校 1年生 1 ST002 次郎 98 36 84 Rainbow小学校 1年生 2 ST003 三郎 87 65 76 Rainbow小学校 1年生
(1-3) サンプル③:APIコールのレスポンス結果(JSON)の値取得(Pandasなし)
{
"message": null,
"results": [
{
"address1": "神奈川県",
"address2": "横浜市神奈川区",
"address3": "羽沢南",
"kana1": "カナガワケン",
"kana2": "ヨコハマシカナガワク",
"kana3": "ハザワミナミ",
"prefcode": "14",
"zipcode": "2210866"
}
],
"status": 200
}
(図120)JSON形式のままになっている
(サンプルプログラム)
import requests
import json
import requests
def main():
url = 'https://zipcloud.ibsnet.co.jp/api/search'
param = '?zipcode=221-0866'
# APIコール
response = requests.get(url+param)
# レスポンスをテキスト形式に変換
result = response.text
# テキスト形式のデータを、JSONディクショナリーとして返却します。
json_object = json.loads(result)
# JSON取り出し関数の実行
padding_count = 0
parse_json(json_object,padding_count)
# JSON取り出し関数
def parse_json(json_object,padding_count):
padding_count += 1
# dict()型のkey/valueの組を順番にループ
for key,value in json_object.items():
# ネスト内部の要素がdict()の場合、再帰的呼び出し(もう一段内部を確認)
if type(value) == type(dict()):
parse_json(value,padding_count)
# ネスト内部の要素がlistの場合
elif type(value) == type(list()):
# list要素を順番にループ
padding_count += 1
for val in value:
# 文字列の場合は、そのkey/valueを出力
if type(val) == type(str()):
print (('[-]'*padding_count+':')+str(key)+'->'+str(val))
# list()型の場合は中身をループして、そのkey/valueを出力
# →listについては、これ以上のネストは追わない(2段階のみを想定)
elif type(val) == type(list()):
padding_count += 1
for i in val:
print (('[-]'*padding_count+':')+str(key)+'->'+str(i))
padding_count -= 1
# dict()の場合、再帰的呼び出し(もう一段内部を確認)
else:
parse_json(val,padding_count)
padding_count -= 1
# valueが更なるネストなく(dict()でもlist()でもない)単なる値の場合は、そのkey/valueを出力
else:
print (('[-]'*padding_count+':')+str(key)+'->'+str(value))
padding_count -= 1
if __name__ == "__main__":
main()
[-]:message->None [-][-][-]:address1->神奈川県 [-][-][-]:address2->横浜市神奈川区 [-][-][-]:address3->羽沢南 [-][-][-]:kana1->カナガワケン [-][-][-]:kana2->ヨコハマシカナガワク [-][-][-]:kana3->ハザワミナミ [-][-][-]:prefcode->14 [-][-][-]:zipcode->2210866 [-]:status->200
(図121)階層を認識しつつ値を取得できている
元データと比較するとこんな感じです
(図122)

