01 / 07
アプリどうしの共通語
天気アプリが天気を表示するとき、その中身はどこかのサーバーから届いている。地図アプリも、乗換案内も同じだよ。
このとき届くのは文字の列だ。そして、その書き方の世界的な約束が JSON(ジェイソン)。
見た目はPythonの辞書にそっくりで、実際、辞書やリストはそのままJSONにできる。だから特別な変換ルールを覚える必要がほとんどないんだ。
モジュールと標準ライブラリ
INPUT · スライド
01 / 07
天気アプリが天気を表示するとき、その中身はどこかのサーバーから届いている。地図アプリも、乗換案内も同じだよ。
このとき届くのは文字の列だ。そして、その書き方の世界的な約束が JSON(ジェイソン)。
見た目はPythonの辞書にそっくりで、実際、辞書やリストはそのままJSONにできる。だから特別な変換ルールを覚える必要がほとんどないんだ。
02 / 07
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
逆向きが 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]}
9006 / 07
ひとつだけ、書き方が変わるものがあるよ。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でも読み書きできる。言語のちがう相手とデータを渡し合うための共通語だよ。
データの渡し方を自分で決めることもできるけれど、そうすると相手も合わせなければいけない。やりたいことは、たいてい誰かがもう作っている——この章でずっと言ってきたことは、道具だけでなく決まりごとにも当てはまるんだ。