JSON基本

投稿者: | 2023-02-19

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日(水)
>>曇り
カテゴリー: JSON