【完全版】JSONデータをPythonで読み書きする方法を徹底解説

pythonPython

(最終更新月:2022年8月)

✔このような方へ向けて書かれた記事となります

「PythonでJSONデータを扱いたい!」

「JSONってそもそも何?」

「PythonでJSONはどんなときに使えるの?」

✔当記事を通じてお伝えすること

  • JSONとは何か?
  • JSONデータをPythonで読み込む方法
  • JSONデータをPythonで書き出す方法
  • 取り扱う際の注意点

当記事を最後までご覧いただければ、JSON形式のデータを読み書きする方法はもちろん、JSONデータ取り扱い時の注意点や実例までご理解いただけます。

profile_icon

【Python歴】10年 x 【営業マン歴】11年

HP作成、社内システムの構築、コンサルティング

Pythonベースのフレームワーク 「Django」を使って下記のようなサイトを作っています!

日報アプリ
当ブログで一から開発方法を解説している日報アプリ(デモ版)です
ツールアプリ
当ブログで紹介したPythonアプリのWeb版です。DjangoAPIとReactで開発。随時更新中です。

icon
icon

JSON形式のデータとは?

JSON形式のデータは、Webアプリ開発などでよく使われます。

こちらでは、JSONについての基本をお伝えするために以下の4点を簡単に解説していきます。

  • JSONとは?
  • JSON形式データのメリット
  • JSON形式データの実例

JSONとは?

JSONとは、データベース内のデータを読み書きする際などによく使われるデータのフォーマットのことです。

「JavaScript Object Notification」という正式名称のとおり、本来はJavaScript言語でデータを取り扱うためのフォーマットでした。

しかしその利便性から、さまざまなシーンで使われるようになったのです。

JSON形式データのメリット

JSON形式データのメリットは以下のとおり。

  • 動作が軽い
  • 視覚的にわかりやすく、解析しやすい
  • 多くのフロントエンドで利用できる

これらのメリットにより、データベースのバックアップや移行によく使われます。

JSON形式データの実例

JSON形式のデータはPythonの辞書型のように構成されています。

必ず{“キー”: “値”}のペアであることが、もっともシンプルなJSON形式です。

具体例は以下のとおり。

{
    "title": "Property1",
    "prefecture": "神奈川県",
    "closest_train": "相鉄本線",
    "closest_station": "西谷",
    "walking_from_station": 3,
    "date_of_construction": "1983-03-01"
}

複数のペアを持つ際は、リスト([ ] )もしくはオブジェクト({ })で囲います。

[
 {
  "pk": 1,
  "fields": {
      "title": "Property1",
      "prefecture": "神奈川県",
      "closest_train": "相鉄本線",
      "closest_station": "西谷",
      "walking_from_station": 3,
      "date_of_construction": "1983-03-01"
             }
  },
  {
   "pk": 2,
   "fields": {
       "title": "Property2",
       "prefecture": "神奈川県",
       "closest_train": "相鉄本線",
       "closest_station": "上星川",
       "walking_from_station": 3,
       "date_of_construction": "1987-03-01"
              }
 },
 {
  "pk": 3,
  "fields": {
  "title": "Property3",
  "prefecture": "東京都",
  "closest_train": "田園都市線",
  "closest_station": "二子玉川",
  "walking_from_station": 3,
  "date_of_construction": "2004-10-01"
            }
  }
]

JSON形式として正しく書かれているかは、こちら(外部リンク)のページで確認可能です。

出典:jsonlint.com

そのほか注意点は別章でご説明しています。

JSONデータを読み込む方法

こちらではJSON形式で書かれたものをPythonで読み込む方法をお伝えします。

主に以下の2通りの方法があります。

  • JSON文字列→Python辞書
  • JSONファイル→Python辞書

それぞれ見ていきます。

JSON形式の文字列をPython辞書型に変換

文字列→辞書」の変換は以下のとおりです。

json.loads(文字列)

例)こちらの文字列をPythonの辞書へ変換します。

>>> json_string = '{"title": "Property1","prefecture": "神奈川県","closest_train": "相鉄本線","closest_station": "西谷","walking_from_station": 3,"date_of_construction": "1983-03-01"}'

#念の為文字列であることを確認します。
>>> print(type(json_string))
<class 'str'>

実際に変換してみます。

>>> import json
>>> python_dict = json.loads(json_string)

#辞書へ変更できているかを確認します。
>>> print(type(python_dict))
<class 'dict'>

bytes型も辞書へ変換可能です。

bytes型とは、文字列をコンピューターに読みやすい配列に並べ替えたものです。

例えば上記の文字列をバイト列に変換し、同じ様に辞書へ変換できるか見てみましょう。

>>> bytes_json = json_string.encode("utf-8")
>>> print(bytes_json)
b'{"title": "Property1","prefecture": "\xe7\xa5\x9e\xe5\xa5\x88\xe5\xb7\x9d\xe7\x9c\x8c","closest_train": "\xe7\x9b\xb8\xe9\x89\x84\xe6\x9c\xac\xe7\xb7\x9a","closest_station": "\xe8\xa5\xbf\xe8\xb0\xb7","walking_from_station": 3,"date_of_construction": "1983-03-01"}'#bytes型に変換されました

>>> python_dict_from_bytes = json.loads(bytes_json)
>>> print(python_dict_from_bytes)
{'title': 'Property1', 'prefecture': '神奈川県', 'closest_train': '相鉄本線', 'closest_station': '西谷', 'walking_from_station': 3, 'date_of_construction': '1983-03-01'}
>>> print(type(python_dict_from_bytes))
<class 'dict'>

文字列と同様に変換できましたね!

JSON形式で書かれたファイルをPython辞書型に変換

JSONファイル→Python辞書」は以下のとおりです。

with open (ファイルパス, “r”, encoding=”utf-8_sig”) as f:

json_data = json.load(f)

例として、ファイル「jason-sample.json」へ、以下のように記述します。

{'title': 'Property1', 'prefecture': '神奈川県', 'closest_train': '相鉄本線', 'closest_station': '西谷', 'walking_from_station': 3, 'date_of_construction': '1983-03-01'}

以下で読み込みます。

with open("json-sample.json", "r", encoding="utf-8_sig") as f:
    json_data = json.load(f)
    print(json_data)

[出力]

{'title': 'Property1', 'prefecture': '神奈川県', 'closest_train': '相鉄本線', 'closest_station': '西谷', 'walking_from_station': 3, 'date_of_construction': '1983-03-01'}

JSONデータとして書き込み

こちらでは、Python辞書からJSONへの変更方法をお伝えします。

  • Python辞書 → JSON文字列
  • Python辞書 → JSONファイル

Python辞書型データをJSON文字列へ変換

Python辞書をJSON文字列へ返還するには以下のとおりです。

json.dumps(Python辞書, ensure_ascii=False)

例をご覧ください。

>>> p_dict = {'title': 'Property1', 'prefecture': '神奈川県', 'closest_train': '相鉄本線', 'closest_station': '西谷', 'walking_from_station': 3, 'date_of_construction': '1983-03-01'}

#辞書であるかを確認
>>> print(type(p_dict))
<class 'dict'>

#変換していきます
>>> json_str = json.dumps(p_dict, ensure_ascii=False)
>>> print(json_str)
'{"title": "Property1", "prefecture": "神奈川県", "closest_train": "相鉄本線", "closest_station": "西谷", "walking_from_station": 3, "date_of_construction": "1983-03-01"}'

「ensure_ascii」を含めた引数を解説していきます。

ensure_ascii

ensure_asciiをFalseにすることで、日本語が正しく表示されます。

もしensure_asciiを設定しないと以下のとおり。

>>> json.dumps(p_dict)
'{"title": "Property1", "prefecture": "\\u795e\\u5948\\u5ddd\\u770c", "closest_train": "\\u76f8\\u9244\\u672c\\u7dda", "closest_station": "\\u897f\\u8c37", "walking_from_station": 3, "date_of_construction": "1983-03-01"}'

英語は正しく表示されますが、日本語は読めません。

separators

separatorsは、デフォルトで(“, “, “: “)となっています。

例えば、(“/ “, “-“)と変更してみましょう。

>>> json.dumps(p_dict, ensure_ascii=False, separators=("/ ", "-"))
'{"title"-"Property1"/ "prefecture"-"神奈川県"/ "closest_train"-"相鉄本線"/ "closest_station"-"西谷"/ "walking_from_station"-3/ "date_of_construction"-"1983-03-01"}'

辞書の「:」が「-」となり、ペア同士が「/」で連結されています。

indent

indentは、改行やスペースを入れるためのものです。

ファイル出力の場合は綺麗に表示されるので重宝しますが、文字列ではあまり役に立ちません。

>>> json.dumps(p_dict, ensure_ascii=False, indent=4)
'{\n    "title": "Property1",\n    "prefecture": "神奈川県",\n    "closest_train": "相鉄本線",\n    "closest_station": "西谷",\n    "walking_from_station": 3,\n    "date_of_construction": "1983-03-01"\n}'

sort_keys

sort_keysはデフォルトはFalseとなっています。

Trueにすると、キーを降順で並び替えます。

>>> json.dumps(p_dict, ensure_ascii=False, sort_keys=True)
'{"closest_station": "西谷", "closest_train": "相鉄本線", "date_of_construction": "1983-03-01", "prefecture": "神奈川県", "title": "Property1", "walking_from_station": 3}'

使える場面は結構ありそうですね。

Python辞書型データをJSONファイルに保存

Python辞書をファイルに書き込むためには以下のようにします。

with open (ファイルパス, “w”, encoding=”utf-8_sig”) as f:

json_data = json.dump(Python辞書, f, **引数)

例はこちらです。

with open("new-json1.json", "w", encoding="utf-8_sig") as f:
    json.dump(p_dict, f, ensure_ascii=False)

「new-json1.json」の中身はこちら。

{"title": "Property1", "prefecture": "神奈川県", "closest_train": "相鉄本線", "closest_station": "西谷", "walking_from_station": 3, "date_of_construction": "1983-03-01"}

引数「indent」を指定します。

with open("new-json2.json", "w", encoding="utf-8_sig") as f:
    json.dump(p_dict, f, ensure_ascii=False, indent=4)

「new-json2.json」は以下のとおりとなりました。

{
    "title": "Property1",
    "prefecture": "神奈川県",
    "closest_train": "相鉄本線",
    "closest_station": "西谷",
    "walking_from_station": 3,
    "date_of_construction": "1983-03-01"
}

indentを指定するととても見やすくなります。

JSONデータを取り扱う際の注意点

PythonでJSONを扱う際に気をつけるべきポイントをまとめました。

  • エンコーディング
  • ダブルクォート
  • データ形式

エンコーディングに気をつける

日本語を表示する際はエンコーディングに気をつける必要があります。

なぜなら何も設定しなければ以下のように表示されてしまうからです。

'{"title": "Property1", "prefecture": "\\u795e\\u5948\\u5ddd\\u770c", "closest_train": "\\u76f8\\u9244\\u672c\\u7dda", "closest_station": "\\u897f\\u8c37", "walking_from_station": 3, "date_of_construction": "1983-03-01"}'

書き込む際には以下の2点を確認しましょう。

  • 引数「ensure_ascii」をFalse
  • encodingを、”utf-8_sig”

ダブルクォートを使う

json.loadやjson.loadsでJSON形式のデータを読み込む際は、引用符がダブルクォートでなければいけません。

もしシングルクォートにすると以下のようなエラーが出てきてしまいます。

json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

データ形式がJSONであるか確認する

JSON形式のデータは、量が多いと複雑になりやすいです。

以下のサイトでコピペするだけで調べられるので、取り込む前に確認しましょう。

The JSON Validator
JSONLint is the free online validator and reformatter tool for JSON, a lightweight data-interchange format.

DjangoフレームワークでJSON形式を扱う

Djangoフレームワークでも、データベース内のデータをJSON形式で読み書きが可能です。

書き出す際は以下のとおりです。

#全体の書き出し
python manage.py dumpdata > data.json

#特定のアプリデータだけ書き出し
python manage.py dumpdata nippo > nippo-data.json

#インデントオプションを使うと読みやすくなります
python manage.py dumpdata --indent 4 > data-indent.json

読み込む際は以下のとおり。

#ファイルの読み込み
python manage.py loaddata data.json

Pythonをベースにしたフレームワーク「Django」について詳しく知りたい方はこちらをどうぞ!

Django
「Django」の記事一覧です。

まとめ:PythonでJSONデータを使えると便利

当記事をまとめます。

  • JSONとは、データの保存に向いているデータ形式である
  • JSONデータを読み込むためには、「json.load」「json.loads」のどちらかを使う
  • JSONデータを書き出すためには、「json.dump」「json.dumps」のどちらかを使う

Webアプリ制作などではデータベースとのやり取りが多くなります。

その際にデータバックアップなどで使えるJSON形式

ここでマスターしておくととても便利なのでおすすめです。

当ブログでは、日報アプリ開発を通じて、Webアプリを一から開発し公開するまでを初学者の方でもわかるようにと記事を連載しています

「Djangoでのアプリ開発を学びたい!」
「Djangoで開発したアプリをWebで公開するにはどうするの?」

という方は必見です!

【Django】チュートリアル|日報アプリの開発から公開まで
Djangoのチュートリアルをお探しですか?具体的に「手を動かして作ってみたい!」という方へ向けて、誰でもできる簡易的な日報アプリの開発を通じて、Djangoの様々な機能に触れていくシリーズとなっています。PythonでWebアプリを作りたい方、必見の記事となります!

公式LINEも始めました。ブログの更新や最新の業界情報などを随時配信します!

友だち追加

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