【Python】Python ~ 基本編 / JSON ~

■ はじめに

Python での JSON の読み込み・書き込みを行う

目次

【0】使用上の注意
 1)値をダブルクォーテーションマーク囲む必要がある
 2)末尾にカンマを入れるのはNG
 3)ndjson については、別モジュールが必要
【1】JSON <=> 文字列
【2】JSONの読み込み
【3】JSONの書き込み
 補足1:indent(インデント)
 補足2:default
【4】JSONデータを追加

【0】使用上の注意

1)値をダブルクォーテーションマーク囲む必要がある
2)末尾にカンマを入れるのはNG

1)値をダブルクォーテーションマーク囲む必要がある

* 文字列⇒JSONへの変換において、
 値をダブルクォーテーションマーク囲む必要がある

サンプル

import json

# OK : 値をダブルクォーテーションマーク囲んでいる
json_text = '{ "aaa1":"hello", "aaa2":"world" }'
json_values = json.loads(json_text)
for v, k in json_values.items():
  print("{} : {}".format(v, k))

# ★NG : 値をダブルクォーテーションマーク囲んでいない
json_text = "{ 'aaa1':'hello', 'aaa2':'world' }"
json_values = json.loads(json_text)
# json.decoder.JSONDecodeError:
# Expecting property name enclosed in double quotes: line 1 column 3 (char 2)

2)末尾にカンマを入れるのはNG

import json

with open('hello.json', 'r') as file:
  json_dict = json.load(file) # ★ここで例外★
  print(json_dict)

hello.json

{
  "Name": "Mike",
  "Age": 24, <= ★ここにカンマがある、ダメ、絶対★
}

例外内容

raceback (most recent call last):
  File "c:/xxxx/demo.py", line 4, in <module>
    json_dict = json.load(file)
 ... 略 ...
json.decoder.JSONDecodeError:
 Expecting property name enclosed in double quotes:
 line 4 column 1 (char 33)

3)ndjson については、別モジュールが必要

* ndjson については、標準 の jsonモジュールでは扱えない
 => 別モジュールが必要
 => 以下の関連記事を参照のこと。

https://dk521123.hatenablog.com/entry/2022/08/30/224248

【1】JSON <=> 文字列

JSON => 文字列

# json.dumps() を使用する

import json
json_text = json.dumps(json_dist)

https://docs.python.org/ja/3/library/json.html#json.dumps

文字列 => JSON

# json.loads() を使用する

import json
json_values = json.loads(json_text)

https://docs.python.org/ja/3/library/json.html#json.load

サンプル

import json

if __name__ == '__main__':
  json_dist = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
  print(type(json_dist))
  print(json_dist)
  print('************')

  # JSON to string
  json_text = json.dumps(json_dist)
  print(type(json_text))
  print(json_text)
  print('************')

  # string to JSON
  json_values = json.loads(json_text)
  print(type(json_values))
  print(json_values)

出力結果

<class 'dict'>
{'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
************
<class 'str'>
{"key1": "value1", "key2": "value2", "key3": "value3"}
************
<class 'dict'>
{'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}

【2】JSONの読み込み

JSONの読み込み

json_file = open('members.json', 'r')
json_dict = json.load(json_file)

https://docs.python.org/ja/3/library/json.html#json.load

サンプル

demo.py

import json

def main():
    json_file = open('members.json', 'r')
    json_dict = json.load(json_file)
    for key, values in json_dict.items():
        print(key)
        print(values['name'])
        print(values['birth_day'])
        print('*******************')

if __name__ == '__main__':
    main()

members.json

{
    "Member01":{
        "name":"Mike",
        "birth_day": "2019-10-12"
    },
    "Member02":{
        "name":"Tom",
        "birth_day": "2002-12-31"
    }
}

出力結果

Member01
Mike
2019-10-12
*******************
Member02
Tom
2002-12-31
*******************

【3】JSONの書き込み

JSONの書き込み

json_file = open('output.json', 'w')
json.dump(input_dict, json_file)

https://docs.python.org/ja/3/library/json.html#json.dump

サンプル

import json

input_dict = [
  {"name": "Smith", "birth_day": "2002-12-21", "gender": "man"},
  {"name": "Lisa", "birth_day": "2003-08-11", "gender": "woman"},
]
with open('output.json', 'w') as json_file:
  json.dump(input_dict, json_file)

print('Done')

出力結果 : output.json

[{"name": "Smith", "birth_day": "2002-12-21", "gender": "man"}, {"name": "Lisa", "birth_day": "2003-08-11", "gender": "woman"}]

補足1:indent(インデント)

* デフォルトだと一行で出力されるので、
 見栄えよく出力したい場合は「indent=2」などと使用するといい
 => 以下の関連記事を参照のこと

PythonPostgreSQL を使う ~ psycopg2編 ~
https://dk521123.hatenablog.com/entry/2020/05/06/141029

補足2:default

* datetime/date などをJSON化する場合、
 エラー「TypeError: Object of type 'datetime' is not JSON serializable」が発生する
 その対策として、default を使用した
 => 以下の関連記事および参考サイトを参照のこと

PythonPostgreSQL を使う ~ psycopg2編 ~
https://dk521123.hatenablog.com/entry/2020/05/06/141029
参考サイト
https://www.yoheim.net/blog.php?q=20170703

【4】JSONデータを追加

* append() を使う

サンプル

tags = [
  {
    "Key": "Id",
    "Value": 10
  },
  {
    "Key": "Name",
    "Value": "Mike"
  }
]

print(tags)
print("************")

additional_info = {
  "Key": "BirthDate",
  "Value": "1988-09-12"
}
tags.append(additional_info)
print(tags)
print("************")

出力結果

[{'Key': 'Id', 'Value': 10}, {'Key': 'Name', 'Value': 'Mike'}]
************
[{'Key': 'Id', 'Value': 10}, {'Key': 'Name', 'Value': 'Mike'}, {'Key': 'BirthDate', 'Value': '1988-09-12'}]
************

参考文献

https://qiita.com/Morio/items/7538a939cc441367070d

関連記事

Python ~ 基本編 / 文字列 ~
https://dk521123.hatenablog.com/entry/2019/10/12/075251
Python ~ 基本編 / astモジュール ~
https://dk521123.hatenablog.com/entry/2021/10/01/000000
Python ~ 基本編 / YAML
https://dk521123.hatenablog.com/entry/2019/10/16/225401
PythonJSONあれこれ ~
https://dk521123.hatenablog.com/entry/2022/02/14/000000
PythonPostgreSQL を使う ~ psycopg2編 ~
https://dk521123.hatenablog.com/entry/2020/05/06/141029
Python ~ ndjson を扱う ~
https://dk521123.hatenablog.com/entry/2022/08/30/224248