モジュールと標準ライブラリ

INPUT · スライド

データを受け渡す形

01 / 07

アプリどうしの共通語

天気アプリが天気を表示するとき、その中身はどこかのサーバーから届いている。地図アプリも、乗換案内も同じだよ。

このとき届くのは文字の列だ。そして、その書き方の世界的な約束が JSON(ジェイソン)。

見た目はPythonの辞書にそっくりで、実際、辞書やリストはそのままJSONにできる。だから特別な変換ルールを覚える必要がほとんどないんだ。

02 / 07

dumps で文字列にする

json.dumps は、Pythonの値を1本の文字列に変える道具。dumps は dump string の略だよ。

出てきたものの型を見ると str。辞書ではなく、もうただの文字になっているのが分かるね。

import jsonhito = {"ten": 80, "kosuu": 3}moji = json.dumps(hito)print(moji)print(type(moji))

実行結果

{"ten": 80, "kosuu": 3}
<class 'str'>

03 / 07

日本語はそのままでは出ない

中身に日本語があると、既定では \u3042 のような記号に置きかえられるよ。壊れているわけではなく、これも正しいJSON。どんな環境でも読めるようにするための安全策だね。

日本語のまま出したいときは ensure_ascii=False を渡そう。キーワード引数(第3章)だよ。

import jsonhito = {"namae": "あおい", "ten": 80}print(json.dumps(hito))print(json.dumps(hito, ensure_ascii=False))

実行結果

{"namae": "\u3042\u304a\u3044", "ten": 80}
{"namae": "あおい", "ten": 80}

04 / 07

loads で元に戻す

逆向きが json.loads。JSONの文字列を受け取って、Pythonの辞書やリストに戻すよ。

戻ってしまえばこちらのもの。hito["namae"] のように、いつもの辞書の書き方で触れるね。

import jsonmoji = '{"namae": "あおい", "ten": 80}'hito = json.loads(moji)print(hito)print(hito["namae"])print(type(hito))

実行結果

{'namae': 'あおい', 'ten': 80}
あおい
<class 'dict'>

05 / 07

入れ子もそのまま行き来する

辞書の中にリスト、リストの中に辞書。どれだけ入れ子になっていても、そのまま往復できるのがJSONの強みだよ。

構造を自分でほどいて組み立て直す必要がない。だから、少し複雑なデータでも安心して渡せるんだ。

import jsonkiroku = {"namae": "あおい", "tens": [80, 90]}moji = json.dumps(kiroku, ensure_ascii=False)print(moji)print(json.loads(moji)["tens"][1])

実行結果

{"namae": "あおい", "tens": [80, 90]}
90

06 / 07

Python の外に出た印

ひとつだけ、書き方が変わるものがあるよ。True は true に、None は null になる。

JSONはPython専用ではないので、Pythonの綴りをそのまま持ち出せないんだ。もちろん json.loads で戻せば、ちゃんと True と None に帰ってくるよ。

import jsonprint(json.dumps({"a": 1, "b": True, "c": None}))print(json.loads('{"a": 1, "b": true, "c": null}'))

実行結果

{"a": 1, "b": true, "c": null}
{'a': 1, 'b': True, 'c': None}

07 / 07

すでに世界が使っている形

JSONはJavaScriptでもJavaでもRubyでもGoでも読み書きできる。言語のちがう相手とデータを渡し合うための共通語だよ。

データの渡し方を自分で決めることもできるけれど、そうすると相手も合わせなければいけない。やりたいことは、たいてい誰かがもう作っている——この章でずっと言ってきたことは、道具だけでなく決まりごとにも当てはまるんだ。