JSON は API が使う文字の形式
JSON(ジェイソン)は、項目と値を文字で表す書き方です。ほとんどの Web API は、JSON で受け取り、JSON で答えます。
貸出アプリが本の情報を送るとき、項目が足りなかったり、型がずれていたりすると、受け付けてもらえません。読み書きと検証を学びます。
このレッスンのゴール
メモ
JSON を読み書きし、項目が正しいかを確かめられる。
重要な言葉
| ことば | いみ | れい |
|---|---|---|
| オブジェクト | 名前と値の組を集めたもの | {"year": 2021} |
| 配列 | 値を順番に並べたリスト | ["sql", "db"] |
| 型 | 値の種類。文字列や数値など | |
| null | 値がないことを表す特別な値 | |
| 検証 | 受け取ったデータが決まりに合うか確かめること |
学生が入力するセルは、このプレビューでは空白です。
JSON の値は6種類でできている
JSON の値は、文字列、数値、真偽値、null、配列、オブジェクトの6種類です。文字列は二重引用符で囲みます。数値は囲みません。
"year": "2021" は文字列で、"year": 2021 は数値です。見た目が似ていても、型は違います。
例: 1冊の本の JSON
| 項目 | 値 | 型 |
|---|---|---|
| title | "Learning SQL" | 文字列 |
| year | 2021 | 数値 |
| lent | false | 真偽値 |
| note | null | null |
| tags | ["sql", "db"] | 配列 |
学生が入力するセルは、このプレビューでは空白です。
例: JSON を Python で読む
import json
text = '{"title": "Learning SQL", "year": 2021, "lent": false, "note": null, "tags": ["sql", "db"]}'
book = json.loads(text)
print(book["title"])
print(type(book["year"]))
print(book["lent"])
print(book["note"])
print(book["tags"][0])
# year を2022に変える。書き出すときは json.dumps を使う。
book["year"] = 2022
print(json.dumps(book))
API は型の合わない JSON を断る
このラボの API は、JSON で行を返します。select で項目を選ぶと、返る JSON の項目が減ります。
本を足すときは、ボディの JSON が表の列に合わなければなりません。合わなければ、API は 400 で断ります。順番に Run してください。
psql にパスワードを渡す
export PGPASSWORD=shopここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
本の表を作り直す
psql -h db -U shop -c "drop table if exists books; create table books (id serial primary key, title text not null, author text not null, year int not null, copies int not null default 1); insert into books (title, author, year, copies) values ('Networks in Practice', 'Mori', 2019, 3), ('Learning SQL', 'Tanaka', 2021, 2), ('Web Design Basics', 'Suzuki', 2018, 0), ('Intro to APIs', 'Kato', 2022, 5); notify pgrst, 'reload schema'"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
題名と年だけの JSON を読む
curl -s -w "\n" "http://api:3000/books?select=title,year&order=id"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
年が数字でない本を送る
curl -s -w "\n%{http_code}\n" -X POST -H "Content-Type: application/json" -d '{"title":"Bad Year","author":"Ito","year":"abc","copies":1}' "http://api:3000/books"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
著者のない本を送る
curl -s -w "\n%{http_code}\n" -X POST -H "Content-Type: application/json" -d '{"title":"No Author"}' "http://api:3000/books"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
断られた2冊が入っていないか見る
curl -s -w "\n" "http://api:3000/books?select=id,title&order=id"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
データベースの前に、自分でも検証する
データベースが断るのは、最後の砦です。アプリは、その前に自分で確かめて、利用者にわかる言葉で伝えます。
検証では、項目があるか、型が合うか、値の範囲が正しいかを、順に調べます。
例: 本の検証ルール
| 項目 | 型 | 条件 |
|---|---|---|
| title | 文字列 | 空でない |
| author | 文字列 | 空でない |
| year | 整数 | 1450 から 2100 |
| copies | 整数 | 0 以上 |
学生が入力するセルは、このプレビューでは空白です。
練習: 1つの項目を検証する
book = {"title": "Learning SQL", "year": "2021"}
if type(book["year"]) == int:
print("year は整数です")
else:
print("year は整数ではありません")
# author の項目があるかを調べる
if "author" in book:
print("author があります")
else:
print("author がありません")
# 練習: "year": "2021" を 2021 に変えて、もう一度 Run しましょう。
よくある間違い
注意
二重引用符で囲んだ "2021" も、数字が入っているから数値だと考えがちです。囲んだ時点で、文字列です。数値として使うには、引用符を付けずに書きます。