Strava/Withings Web API開発 - Pythonリファレンス(データ格納:JSONと配列、辞書)
JSONとは
JSON(JavaScript Object Notaion)
JavaScript のデータ定義文をベースとした、簡易的なデータ定義言語です。
(参考)JSONについて調べてみた
https://qiita.com/chihiro/items/dd1912c1406dbfe16b72
OpenWeatherMapもStravaもWithingsも全てこのJSONでデータを扱っており、Web APIでのデファクトスタンダードのようです。
(参考)5分で分かるWebAPI
https://developer.ntt.com/ja/blog/5%E5%88%86%E3%81%A7%E5%88%86%E3%81%8B%E3%82%8BWebAPI
JSONのフォーマット
以下の通り記述します。{ } の中に、ダブルクォーテーション(")で変数と値を囲み、カンマで変数と値を区切ります。
{
"name": "SanoAtsu",
"date": "20200519",
"Distance":20.5,
"MaxHR": 186
}
例えばこのサンプルだと、自分が5月19日に実施したトレーニングの走行距離が20.5km、最大心拍数が186というのがわかります。
これがCSV形式だと、"SanoAtsu,20200519,20.5,186" といった形式になって、一見何のデータか分かりづらいですが、JSONだとぱっと見で何のデータか判別しやすく、またプログラムで処理しやすい、というメリットがあるようです。
配列
Pythonでは配列を以下の通りに表記します。
list = [1,2,3,4]
(参考)入門者必見!Pythonのリスト(配列)を使いこなすための5つのステップ
https://www.sejuku.net/blog/32681
JSONと配列の組み合わせ
JSONと配列を組み合わせると以下の形式となります。
OpenWeatherMap/Strava/Withingsからデータを取得するとこの形式になります。
[
{
"name": "SanoAtsu",
"date": "20200517",
"Distance":15.1,
"MaxHR": 173
},
{
"name": "SanoAtsu",
"date": "20200518",
"Distance":8.2,
"MaxHR": 155
},
{
"name": "SanoAtsu",
"date": "20200519",
"Distance":20.5,
"MaxHR": 186
}
]
このサンプルでは、5月17日、18日、19日のトレーニングデータ(距離と最大心拍数)をそれぞれ表しています。
JSONから辞書に変換
以下リンクを見ると、辞書はdict型のオブジェクト、JSONは文字列とのことです。プログラムで扱うにはdict型への変換(json.loads)が必須です。
(参考)Python3 辞書型⇔文字列(JSON)の相互変換
https://www.lisz-works.com/entry/python-convert-json-dict
dict型に変換した後は、値を取り出して配列に格納します。配列に格納することで、画面表示やグラフ化など加工が可能になります。
(参考)PythonでWeb APIを叩いてJSONをパースする
https://qiita.com/bowtin/items/4dcab3389c892baba1a5
コーディング例(天気予報データ)
・JSONデータ
{
"date": "20200519",
"weather": "雨",
"temp":20,
}
{
"date": "20200520",
"weather": "曇り",
"temp":21,
}
・・・
・実行処理
response=requests.get(url) ##Web APIでHTTP GET
forecastJSON=json.loads(response.text) ##JSON形式でデータを格納
for item in forecastJSON: ## {}のデータを1件づつ処理
forecastDate = item["date"] ##日付
forecastWeather = item["weather"] ##天気
forecastTemp = item["temp"] ##気温
・結果
以下のように配列にデータが格納されます。
forecastDate [5/19,5/20,5/21,5/22,5/23,5/24,5/25]
forecastWeather [雨,曇り,曇り,晴れ,雨,曇り,曇り]
forecastTemp [20,21,20,25,18,20,21]
配列に格納後、画面表示やグラフ化などが可能になります。
よろしければサポートお願いします。