クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

JSON を読み書きして検証する

このレッスンのあとで: JSON を読み書きし、項目が正しいかを確かめられる。

60分のレッスンコマンド6件PostgreSQL と PostgREST のラボ:ブラウザーで学ぶデータベースと REST API

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"文字列
year2021数値
lentfalse真偽値
notenullnull
tags["sql", "db"]配列

学生が入力するセルは、このプレビューでは空白です。

例: JSON を Python で読む

コード: 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つの項目を検証する

コード: python
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" も、数字が入っているから数値だと考えがちです。囲んだ時点で、文字列です。数値として使うには、引用符を付けずに書きます。

このラボとソースについて: PostgreSQL と PostgREST のラボ:ブラウザーで学ぶデータベースと REST API

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。