JSONはリストにdicをappendすればよい
目次
基本
UTF-8固定
- JSONの文字コードは「UTF-8(BOMなし)」固定
- openするときは
encoding='utf-8'の指定を忘れない - windows の場合、その引数を忘れると既定のShift-JIS で開くため文字化けする
json.dump と 引数 ensure_ascii=False
- json.dump で書き込む際、ensure_ascii=False を指定すること
- でないと、日本語はエスケープされて書き込まれてしまう
- この場合、dumpしたJsonファイルやCSVを開くと日本語が文字化けする
import json
# JSONファイルの書き込み
with open('test.json', 'w', encoding='utf-8') as fp:
json.dump('日本語あいうえお' fp, ensure_ascii=False)UTF-8のBOMなし判定
- BOM = バイトオーダーマーク
- 「0xFEFF」で表される2バイトの識別子で、ファイルの先頭に付与される。エンコーディングが不明なファイルを読み込む際、容易にUTF-8であることがわかるためのもの
- JSONの文字コードはUTF-8(BOMなし)固定となっているが、BOMがあった場合は以下のスクリプトで読み飛ばす処理を入れると良い
import json
with open('bom_test.txt', 'r', encoding='utf-8') as fp:
text = fp.read()
if ord(text[0:1]) == 0xFEFF: # 1文字目の文字コードがBOMであれば読み飛ばす
text = text[1:]
data = json.loads(text)
print(data)JSONの読み込みと書き込み
シリアライズとデシリアライズ
- プログラム内で扱う複数の要素を、1つの文字列やバイト列で表現できる形に変換することを「シリアライズ」または「シリアル化」という
- シリアライズの逆の動作、つまり文字列やバイト列から複数の要素に戻すことを「デシリアライズ」という

リスト型などはそのままファイルに保存できない
- 保存しようとすると

- エラーになる。関数 write() の引数は文字列型であるべき、リストじゃないよ、と。

リスト型をファイルに保存する方法
Pythonデータ型からJSON文字列へのシリアライズ
import json
s = json.dumps(データ[, オプション])
| メソッド | 説明 |
| json.dumps (データ) ←strings | データをJSON文字列に変換して返す |
| json.dump (データ) | データをJSON文字列に変換してIOに書き込む |
import json
a_list = 'バナナ マンゴー キウイ'.split()
with open('a_list.json', 'w', encoding='utf-8') as fp:
json_str = json.dumps(a_list, ensure_ascii=False)
fp.write(json_str)
>> ["バナナ", "マンゴー", "キウイ"]JSON文字列をファイルから読み込む方法
JSON文字列をPythonデータにデシリアライズする
データ = json.loads(文字列 [,オプション])
import json
with open('a_list.json', encoding='utf-8') as fp:
json_str = fp.read() # 一度読み出す
# JSON文字列をPythonデータにデシリアライズ
a_list = json.loads(json_str)
for s in a_list:
print(s)
>> バナナ
>> マンゴー
>> キウイ可読性の高いJSONで出力★
- indent
import json
data = {'名前': '鈴木', '趣味': ['読書', 'プログラミング', '盆栽']}
# 分かりやすくJSON出力
print(json.dumps(
data,
indent=4,
ensure_ascii=False
))
>> {
>> "名前": "鈴木",
>> "趣味": [
>> "読書",
>> "プログラミング",
>> "盆栽"
>> ]
>> }スクリプトにJSONを埋め込む「”’〜”’」
- JSONにはダブルクォートが頻出するため、シングルクォート3つがよい
import json
json_str = '''
{"tokyo":
[
{"date": "6日(水)", "forecast": "曇り"},
{"date": "6日(水)", "forecast": "曇り"}
]
}
'''
data = json.loads(json_str)
print(data['tokyo'][0]['date'])
print(data['tokyo'][0]['forecast'])
>>6日(水)
>>曇り