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

※本サイトにはプロモーション・広告が含まれています。

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

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

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

「JSONってそもそも何?」

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

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

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

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

icon
icon

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間17万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

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形式のデータは、量が多いと複雑になりやすいです。

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

JSON Online Validator and Formatter - JSON Lint
JSONLint is the free online validator, json formatter, and json beautifier tool for JSON, a lightweight data-interchange...

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について学びたいですか?当サイトのメインコンテンツのひとつ、Djangoチュートリアルをはじめとし、さまざまなDjangoに関する情報を、実際のアプリ開発コード付きで解説しています。ぜひご覧ください。

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

当記事をまとめます。

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

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

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

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

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