PythonでのJSON利用例 見た目を整える

JSON

JSONは、データをコンピュータも人も扱いやすい形にするものです。
今回は人が見やすい形に変更します。

今回扱うデータ

MetaWeather 天気予報のWeb APIからのデータを、requestsモジュールを利用して読み込みます。
location/1118370は東京を表すコードです。

>>> import requests
>>> r = requests.get('https://www.metaweather.com/api/location/1118370')

まず変数”r”にデータを格納してステータスを確認。

>>> r.status_code
200
>>> r.headers['content-type']
'application/json'
>>> r.encoding
'utf-8'

Status Codeが200と言う事は、サーバーへのrequestがきちんと届き、求めたデータが返された事を示しています。
content-typeが’appication/json’になっているので、Web APIがデータを扱う為のjson形式のデータ、と言う事が分かります。
json形式と言う事はencodingはutf-8のはずですが、確かにその通りになっています。

r.textで出力するとjson形式そのままで吐き出され、中身を見る事が出来ますが、このままでは人間の目では見にくい。

因みに、下記codeが書かれた箱の上、左から3つめ”Toggle Line Wrap”をクリックすると、コードが折りたたまれて全文を一覧しやすくなります。

>>> r.text
'{"consolidated_weather":[{"id":4534167229431808,"weather_state_name":"Light Rain","weather_state_abbr":"lr","wind_direction_compass":"NNE","created":"2021-06-20T03:36:46.125447Z","applicable_date":"2021-06-20","min_temp":19.79,"max_temp":26.205,"the_temp":26.89,"wind_speed":7.630599006132189,"wind_direction":29.000000000000004,"air_pressure":998.0,"humidity":73,"visibility":11.583912451284498,"predictability":75},{"id":5208805794119680,"weather_state_name":"Showers","weather_state_abbr":"s","wind_direction_compass":"SSE","created":"2021-06-20T03:36:49.450941Z","applicable_date":"2021-06-21","min_temp":21.284999999999997,"max_temp":27.705,"the_temp":26.525,"wind_speed":6.444322981887113,"wind_direction":148.37889841508593,"air_pressure":1004.5,"humidity":57,"visibility":13.370043943370716,"predictability":73},{"id":5174934071410688,"weather_state_name":"Showers","weather_state_abbr":"s","wind_direction_compass":"S","created":"2021-06-20T03:36:52.006442Z","applicable_date":"2021-06-22","min_temp":21.43,"max_temp":26.299999999999997,"the_temp":25.28,"wind_speed":7.890906107919086,"wind_direction":169.45400062966624,"air_pressure":1008.5,"humidity":66,"visibility":11.549426350115326,"predictability":73},{"id":4797483621285888,"weather_state_name":"Light Rain","weather_state_abbr":"lr","wind_direction_compass":"ENE","created":"2021-06-20T03:36:54.938740Z","applicable_date":"2021-06-23","min_temp":20.82,"max_temp":26.18,"the_temp":25.075,"wind_speed":6.386218420642117,"wind_direction":77.0,"air_pressure":1010.0,"humidity":64,"visibility":11.041144714865187,"predictability":75},{"id":6085661653204992,"weather_state_name":"Showers","weather_state_abbr":"s","wind_direction_compass":"NE","created":"2021-06-20T03:36:57.973908Z","applicable_date":"2021-06-24","min_temp":20.335,"max_temp":25.049999999999997,"the_temp":24.630000000000003,"wind_speed":7.422489563464037,"wind_direction":54.21205312696262,"air_pressure":1010.5,"humidity":68,"visibility":10.834538793446274,"predictability":73},{"id":6252981063254016,"weather_state_name":"Heavy Rain","weather_state_abbr":"hr","wind_direction_compass":"NNE","created":"2021-06-20T03:37:01.972644Z","applicable_date":"2021-06-25","min_temp":19.67,"max_temp":23.615000000000002,"the_temp":20.18,"wind_speed":5.359549033643521,"wind_direction":29.499999999999996,"air_pressure":1011.0,"humidity":84,"visibility":8.887472162570587,"predictability":77}],"time":"2021-06-20T15:20:16.797014+09:00","sun_rise":"2021-06-20T04:25:30.740096+09:00","sun_set":"2021-06-20T18:59:53.501819+09:00","timezone_name":"JST","parent":{"title":"Japan","location_type":"Country","woeid":23424856,"latt_long":"37.487598,139.838287"},"sources":[{"title":"BBC","slug":"bbc","url":"http://www.bbc.co.uk/weather/","crawl_rate":360},{"title":"Forecast.io","slug":"forecast-io","url":"http://forecast.io/","crawl_rate":480},{"title":"HAMweather","slug":"hamweather","url":"http://www.hamweather.com/","crawl_rate":360},{"title":"Met Office","slug":"met-office","url":"http://www.metoffice.gov.uk/","crawl_rate":180},{"title":"OpenWeatherMap","slug":"openweathermap","url":"http://openweathermap.org/","crawl_rate":360},{"title":"Weather Underground","slug":"wunderground","url":"https://www.wunderground.com/?apiref=fc30dc3cd224e19b","crawl_rate":720},{"title":"World Weather Online","slug":"world-weather-online","url":"http://www.worldweatheronline.com/","crawl_rate":360}],"title":"Tokyo","location_type":"City","woeid":1118370,"latt_long":"35.670479,139.740921","timezone":"Asia/Tokyo"}'

まずはDecodeして扱いやすいPython形式に変える

ここでr.text => r.json()とすると、rのmethod “r.json()”でjson形式からPythonのdictionaryのデータ型にDecode(Deserialization)されます。
因みに、このrは

r = requests.get('https://www.metaweather.com/api/location/1118370')

のrであり、request.getで得られたObject(Response Objectと呼ばれている)になります。

これをただr.json()で出力すると下記の通り。

>>> r.json()
{'consolidated_weather': [{'id': 4534167229431808, 'weather_state_name': 'Light Rain', 'weather_state_abbr': 'lr', 'wind_direction_compass': 'NNE', 'created': '2021-06-20T03:36:46.125447Z', 'applicable_date': '2021-06-20', 'min_temp': 19.79, 'max_temp': 26.205, 'the_temp': 26.89, 'wind_speed': 7.630599006132189, 'wind_direction': 29.000000000000004, 'air_pressure': 998.0, 'humidity': 73, 'visibility': 11.583912451284498, 'predictability': 75}, {'id': 5208805794119680, 'weather_state_name': 'Showers', 'weather_state_abbr': 's', 'wind_direction_compass': 'SSE', 'created': '2021-06-20T03:36:49.450941Z', 'applicable_date': '2021-06-21', 'min_temp': 21.284999999999997, 'max_temp': 27.705, 'the_temp': 26.525, 'wind_speed': 6.444322981887113, 'wind_direction': 148.37889841508593, 'air_pressure': 1004.5, 'humidity': 57, 'visibility': 13.370043943370716, 'predictability': 73}, {'id': 5174934071410688, 'weather_state_name': 'Showers', 'weather_state_abbr': 's', 'wind_direction_compass': 'S', 'created': '2021-06-20T03:36:52.006442Z', 'applicable_date': '2021-06-22', 'min_temp': 21.43, 'max_temp': 26.299999999999997, 'the_temp': 25.28, 'wind_speed': 7.890906107919086, 'wind_direction': 169.45400062966624, 'air_pressure': 1008.5, 'humidity': 66, 'visibility': 11.549426350115326, 'predictability': 73}, {'id': 4797483621285888, 'weather_state_name': 'Light Rain', 'weather_state_abbr': 'lr', 'wind_direction_compass': 'ENE', 'created': '2021-06-20T03:36:54.938740Z', 'applicable_date': '2021-06-23', 'min_temp': 20.82, 'max_temp': 26.18, 'the_temp': 25.075, 'wind_speed': 6.386218420642117, 'wind_direction': 77.0, 'air_pressure': 1010.0, 'humidity': 64, 'visibility': 11.041144714865187, 'predictability': 75}, {'id': 6085661653204992, 'weather_state_name': 'Showers', 'weather_state_abbr': 's', 'wind_direction_compass': 'NE', 'created': '2021-06-20T03:36:57.973908Z', 'applicable_date': '2021-06-24', 'min_temp': 20.335, 'max_temp': 25.049999999999997, 'the_temp': 24.630000000000003, 'wind_speed': 7.422489563464037, 'wind_direction': 54.21205312696262, 'air_pressure': 1010.5, 'humidity': 68, 'visibility': 10.834538793446274, 'predictability': 73}, {'id': 6252981063254016, 'weather_state_name': 'Heavy Rain', 'weather_state_abbr': 'hr', 'wind_direction_compass': 'NNE', 'created': '2021-06-20T03:37:01.972644Z', 'applicable_date': '2021-06-25', 'min_temp': 19.67, 'max_temp': 23.615000000000002, 'the_temp': 20.18, 'wind_speed': 5.359549033643521, 'wind_direction': 29.499999999999996, 'air_pressure': 1011.0, 'humidity': 84, 'visibility': 8.887472162570587, 'predictability': 77}], 'time': '2021-06-20T15:20:16.797014+09:00', 'sun_rise': '2021-06-20T04:25:30.740096+09:00', 'sun_set': '2021-06-20T18:59:53.501819+09:00', 'timezone_name': 'JST', 'parent': {'title': 'Japan', 'location_type': 'Country', 'woeid': 23424856, 'latt_long': '37.487598,139.838287'}, 'sources': [{'title': 'BBC', 'slug': 'bbc', 'url': 'http://www.bbc.co.uk/weather/', 'crawl_rate': 360}, {'title': 'Forecast.io', 'slug': 'forecast-io', 'url': 'http://forecast.io/', 'crawl_rate': 480}, {'title': 'HAMweather', 'slug': 'hamweather', 'url': 'http://www.hamweather.com/', 'crawl_rate': 360}, {'title': 'Met Office', 'slug': 'met-office', 'url': 'http://www.metoffice.gov.uk/', 'crawl_rate': 180}, {'title': 'OpenWeatherMap', 'slug': 'openweathermap', 'url': 'http://openweathermap.org/', 'crawl_rate': 360}, {'title': 'Weather Underground', 'slug': 'wunderground', 'url': 'https://www.wunderground.com/?apiref=fc30dc3cd224e19b', 'crawl_rate': 720}, {'title': 'World Weather Online', 'slug': 'world-weather-online', 'url': 'http://www.worldweatheronline.com/', 'crawl_rate': 360}], 'title': 'Tokyo', 'location_type': 'City', 'woeid': 1118370, 'latt_long': '35.670479,139.740921', 'timezone': 'Asia/Tokyo'}


一見、区切りがダブルクォーテーション「”」からシングルクォーテーション「’」に変わり、最初と最後の「’」クオーテーションマークが取れただけの同じようなデータに見えますが、実際はPythonのdictionary型データであり、扱い易くなっています。

Encodeをして見た目を整える

上記でjson型のデータをPythonのdictionary型にdecodeしたので、今からPythonのjsonモジュールを使用して見易くします。

変数rjに、元データ(json型)からdictionary型データにdecodeされたr.json()から、json.dumpsでEncodeしたデータを格納します。
その際、「indent=4」の様にindentを入れます。

>>> import json
>>> rj = json.dumps(r.json(), indent=4)

このrjをただ出力すると、同じ様な見にくいデータのままですが、見ると所々に改行「\n」が入っていることが分かります。

>>> rj
'{\n    "consolidated_weather": [\n        {\n            "id": 6102397261709312,\n            "weather_state_name": "Light Rain",\n            "weather_state_abbr": "lr",\n            "wind_direction_compass": "NNE",\n            "created": "2021-06-20T12:36:47.257802Z",\n            "applicable_date": "2021-06-20",\n            "min_temp": 19.935,\n            "max_temp": 27.22,\n            "the_temp": 26.630000000000003,\n            "wind_speed": 7.182764119594899,\n            "wind_direction": 28.500000000000007,\n            "air_pressure": 998.0,\n            "humidity": 70,\n            "visibility": 12.777877197168536,\n            "predictability": 75\n        },\n        {\n            "id": 4728843366563840,\n            "weather_state_name": "Light Rain",\n            "weather_state_abbr": "lr",\n            "wind_direction_compass": "SE",\n            "created": "2021-06-20T12:36:50.227358Z",\n            "applicable_date": "2021-06-21",\n            "min_temp": 20.95,\n            "max_temp": 26.695,\n            "the_temp": 26.189999999999998,\n            "wind_speed": 6.865762760969273,\n            "wind_direction": 135.31537751253472,\n            "air_pressure": 1005.0,\n            "humidity": 61,\n            "visibility": 13.416957468384634,\n            "predictability": 75\n        },\n        {\n            "id": 6154227517751296,\n            "weather_state_name": "Light Rain",\n            "weather_state_abbr": "lr",\n            "wind_direction_compass": "SSE",\n            "created": "2021-06-20T12:36:53.134335Z",\n            "applicable_date": "2021-06-22",\n            "min_temp": 20.275,\n            "max_temp": 26.965,\n            "the_temp": 25.47,\n            "wind_speed": 6.456194872952625,\n            "wind_direction": 153.04371766880197,\n            "air_pressure": 1008.0,\n            "humidity": 65,\n            "visibility": 12.072310208383044,\n            "predictability": 75\n        },\n        {\n            "id": 6213293283737600,\n            "weather_state_name": "Light Rain",\n            "weather_state_abbr": "lr",\n            "wind_direction_compass": "ENE",\n            "created": "2021-06-20T12:36:56.308709Z",\n            "applicable_date": "2021-06-23",\n            "min_temp": 20.47,\n            "max_temp": 26.265,\n            "the_temp": 25.56,\n            "wind_speed": 7.1646883915294675,\n            "wind_direction": 74.16831695049069,\n            "air_pressure": 1009.5,\n            "humidity": 61,\n            "visibility": 11.8169266483735,\n            "predictability": 75\n        },\n        {\n            "id": 4857742415101952,\n            "weather_state_name": "Showers",\n            "weather_state_abbr": "s",\n            "wind_direction_compass": "ENE",\n            "created": "2021-06-20T12:36:59.730423Z",\n            "applicable_date": "2021-06-24",\n            "min_temp": 19.854999999999997,\n            "max_temp": 27.475,\n            "the_temp": 26.450000000000003,\n            "wind_speed": 6.2296495297303744,\n            "wind_direction": 65.59226935085387,\n            "air_pressure": 1011.0,\n            "humidity": 59,\n            "visibility": 12.645214447625865,\n            "predictability": 73\n        },\n        {\n            "id": 4946185220521984,\n            "weather_state_name": "Heavy Rain",\n            "weather_state_abbr": "hr",\n            "wind_direction_compass": "NNE",\n            "created": "2021-06-20T12:37:02.334879Z",\n            "applicable_date": "2021-06-25",\n            "min_temp": 18.965,\n            "max_temp": 23.72,\n            "the_temp": 18.94,\n            "wind_speed": 6.0477083830430285,\n            "wind_direction": 27.0,\n            "air_pressure": 1010.0,\n            "humidity": 87,\n            "visibility": 8.288470333253798,\n            "predictability": 77\n        }\n    ],\n    "time": "2021-06-20T23:46:38.256891+09:00",\n    "sun_rise": "2021-06-20T04:25:30.740096+09:00",\n    "sun_set": "2021-06-20T18:59:53.501819+09:00",\n    "timezone_name": "JST",\n    "parent": {\n        "title": "Japan",\n        "location_type": "Country",\n        "woeid": 23424856,\n        "latt_long": "37.487598,139.838287"\n    },\n    "sources": [\n        {\n            "title": "BBC",\n            "slug": "bbc",\n            "url": "http://www.bbc.co.uk/weather/",\n            "crawl_rate": 360\n        },\n        {\n            "title": "Forecast.io",\n            "slug": "forecast-io",\n            "url": "http://forecast.io/",\n            "crawl_rate": 480\n        },\n        {\n            "title": "HAMweather",\n            "slug": "hamweather",\n            "url": "http://www.hamweather.com/",\n            "crawl_rate": 360\n        },\n        {\n            "title": "Met Office",\n            "slug": "met-office",\n            "url": "http://www.metoffice.gov.uk/",\n            "crawl_rate": 180\n        },\n        {\n            "title": "OpenWeatherMap",\n            "slug": "openweathermap",\n            "url": "http://openweathermap.org/",\n            "crawl_rate": 360\n        },\n        {\n            "title": "Weather Underground",\n            "slug": "wunderground",\n            "url": "https://www.wunderground.com/?apiref=fc30dc3cd224e19b",\n            "crawl_rate": 720\n        },\n        {\n            "title": "World Weather Online",\n            "slug": "world-weather-online",\n            "url": "http://www.worldweatheronline.com/",\n            "crawl_rate": 360\n        }\n    ],\n    "title": "Tokyo",\n    "location_type": "City",\n    "woeid": 1118370,\n    "latt_long": "35.670479,139.740921",\n    "timezone": "Asia/Tokyo"\n}'

最初と最後の{}の外にシングルクォーテーション「’」がある事から、Pythonのdictionary型からjson形式データにEncodeされた事が分かります。

このrjをprint()で出力すると、indent=4で整えられた人間の目で見やすいデータになりました。

>>> print(rj)
{
    "consolidated_weather": [
        {
            "id": 6102397261709312,
            "weather_state_name": "Light Rain",
            "weather_state_abbr": "lr",
            "wind_direction_compass": "NNE",
            "created": "2021-06-20T12:36:47.257802Z",
            "applicable_date": "2021-06-20",
            "min_temp": 19.935,
            "max_temp": 27.22,
            "the_temp": 26.630000000000003,
            "wind_speed": 7.182764119594899,
            "wind_direction": 28.500000000000007,
            "air_pressure": 998.0,
            "humidity": 70,
            "visibility": 12.777877197168536,
            "predictability": 75
        },
        {
            "id": 4728843366563840,
            "weather_state_name": "Light Rain",
            "weather_state_abbr": "lr",
            "wind_direction_compass": "SE",
            "created": "2021-06-20T12:36:50.227358Z",
            "applicable_date": "2021-06-21",
            "min_temp": 20.95,
            "max_temp": 26.695,
            "the_temp": 26.189999999999998,
            "wind_speed": 6.865762760969273,
            "wind_direction": 135.31537751253472,
            "air_pressure": 1005.0,
            "humidity": 61,
            "visibility": 13.416957468384634,
            "predictability": 75
        },
        {
            "id": 6154227517751296,
            "weather_state_name": "Light Rain",
            "weather_state_abbr": "lr",
            "wind_direction_compass": "SSE",
            "created": "2021-06-20T12:36:53.134335Z",
            "applicable_date": "2021-06-22",
            "min_temp": 20.275,
            "max_temp": 26.965,
            "the_temp": 25.47,
            "wind_speed": 6.456194872952625,
            "wind_direction": 153.04371766880197,
            "air_pressure": 1008.0,
            "humidity": 65,
            "visibility": 12.072310208383044,
            "predictability": 75
        },
        {
            "id": 6213293283737600,
            "weather_state_name": "Light Rain",
            "weather_state_abbr": "lr",
            "wind_direction_compass": "ENE",
            "created": "2021-06-20T12:36:56.308709Z",
            "applicable_date": "2021-06-23",
            "min_temp": 20.47,
            "max_temp": 26.265,
            "the_temp": 25.56,
            "wind_speed": 7.1646883915294675,
            "wind_direction": 74.16831695049069,
            "air_pressure": 1009.5,
            "humidity": 61,
            "visibility": 11.8169266483735,
            "predictability": 75
        },
        {
            "id": 4857742415101952,
            "weather_state_name": "Showers",
            "weather_state_abbr": "s",
            "wind_direction_compass": "ENE",
            "created": "2021-06-20T12:36:59.730423Z",
            "applicable_date": "2021-06-24",
            "min_temp": 19.854999999999997,
            "max_temp": 27.475,
            "the_temp": 26.450000000000003,
            "wind_speed": 6.2296495297303744,
            "wind_direction": 65.59226935085387,
            "air_pressure": 1011.0,
            "humidity": 59,
            "visibility": 12.645214447625865,
            "predictability": 73
        },
        {
            "id": 4946185220521984,
            "weather_state_name": "Heavy Rain",
            "weather_state_abbr": "hr",
            "wind_direction_compass": "NNE",
            "created": "2021-06-20T12:37:02.334879Z",
            "applicable_date": "2021-06-25",
            "min_temp": 18.965,
            "max_temp": 23.72,
            "the_temp": 18.94,
            "wind_speed": 6.0477083830430285,
            "wind_direction": 27.0,
            "air_pressure": 1010.0,
            "humidity": 87,
            "visibility": 8.288470333253798,
            "predictability": 77
        }
    ],
    "time": "2021-06-20T23:46:38.256891+09:00",
    "sun_rise": "2021-06-20T04:25:30.740096+09:00",
    "sun_set": "2021-06-20T18:59:53.501819+09:00",
    "timezone_name": "JST",
    "parent": {
        "title": "Japan",
        "location_type": "Country",
        "woeid": 23424856,
        "latt_long": "37.487598,139.838287"
    },
    "sources": [
        {
            "title": "BBC",
            "slug": "bbc",
            "url": "http://www.bbc.co.uk/weather/",
            "crawl_rate": 360
        },
        {
            "title": "Forecast.io",
            "slug": "forecast-io",
            "url": "http://forecast.io/",
            "crawl_rate": 480
        },
        {
            "title": "HAMweather",
            "slug": "hamweather",
            "url": "http://www.hamweather.com/",
            "crawl_rate": 360
        },
        {
            "title": "Met Office",
            "slug": "met-office",
            "url": "http://www.metoffice.gov.uk/",
            "crawl_rate": 180
        },
        {
            "title": "OpenWeatherMap",
            "slug": "openweathermap",
            "url": "http://openweathermap.org/",
            "crawl_rate": 360
        },
        {
            "title": "Weather Underground",
            "slug": "wunderground",
            "url": "https://www.wunderground.com/?apiref=fc30dc3cd224e19b",
            "crawl_rate": 720
        },
        {
            "title": "World Weather Online",
            "slug": "world-weather-online",
            "url": "http://www.worldweatheronline.com/",
            "crawl_rate": 360
        }
    ],
    "title": "Tokyo",
    "location_type": "City",
    "woeid": 1118370,
    "latt_long": "35.670479,139.740921",
    "timezone": "Asia/Tokyo"
}

う〜ん、見やすさが段違い。
元のtextデータに一つ一つ改行などしていたらどれだけの時間が掛かるのか想像もしたくないですね。

今回やった事

Web Apiからjson形式で取得したデータを

requestモジュールを使用して扱いやすいPython型にDocodeした上で

jsonモジュールのjson.dumps()で見やすいjson形式データにEncodeして出力

今回はJSONモジュールを使って人の目で見やすい形式にしました。
次はコンピューターが扱いやすい形式に。

コメント

タイトルとURLをコピーしました