発注データの旅
コンビニの店長が、タブレットでお茶を10本発注しました。
その発注は、本部のシステム、物流センター、配送トラックのアプリへと順に渡ります。作った会社がそれぞれ違うプログラムです。
どのプログラムも読める、共通の書き方が必要です。よく使われるのが JSON と YAML です。
このレッスンのゴール
メモ
JSON と YAML で書かれたデータを読み書きできる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| JSON | プログラム同士でデータを渡すための文字の書き方 | |
| オブジェクト | キーと値の組を波かっこで囲んだもの | {"order_id": 5021} |
| キー | 値を取り出すための名前 | store |
| リスト | 順番に並んだ値を角かっこで囲んだもの | ["おにぎり", "お茶"] |
| 入れ子 | データの中に別のデータがある形 | |
| YAML | 同じデータを字下げで書く形式 |
学生が入力するセルは、このプレビューでは空白です。
JSON はオブジェクトとリストでできている
オブジェクトは { } で囲みます。中には「キー: 値」の組を、カンマで区切って並べます。
リストは [ ] で囲みます。値が順番に並びます。
Python では json.loads で文字列を辞書に変え、キーで値を取り出します。
キーと変数の名前は英語にしています。多くの会社でそうするからです。値は日本語でかまいません。
発注データを読む
import json
# 発注システムから届いたデータです。最初はただの文字列です。
text = '{"store": "梅田店", "order_id": 5021, "items": ["おにぎり", "お茶", "弁当"]}'
order = json.loads(text) # 文字列が辞書になります
print(order["store"])
print(order["order_id"])
print(order["items"][0])
# やってみましょう: 二つ目の商品、お茶を表示してください。
入れ子のデータは一段ずつたどる
値が、別のオブジェクトやリストになることがあります。これを入れ子と言います。
奥の値を取り出すときは、一段ずつ進みます。キー、次のキー、そして番号の順です。
リストの番号は 0 から数えます。一つ目が 0、二つ目が 1 です。
表のデータ: {"order_id": 5021, "store": {"name": "梅田店", "city": "大阪市"}, "lines": [{"name": "お茶", "qty": 10}, {"name": "弁当", "qty": 4}]}
例: 入れ子の発注データ
| 書き方 | たどる順 | 結果 |
|---|---|---|
| order["order_id"] | order_id | 5021 |
| order["store"]["city"] | 店、その市 | 大阪市 |
| order["lines"][0]["name"] | 明細、一つ目、その商品名 | お茶 |
| order["lines"][1]["qty"] | 明細、二つ目、その数量 | 4 |
| order["lines"][2] | 明細、三つ目 | エラー: 二つしかない |
学生が入力するセルは、このプレビューでは空白です。
よくある誤解
注意
JSON でも Python と同じように一重引用符が使える、と思われがちです。JSON で使えるのは二重引用符だけです。{'id': 1} と書くと json.loads はエラーになります。JSON の文字列には必ず " を使いましょう。
発注を JSON にする
import json
# 新しい発注を、Python の辞書で作ります。
order = {"store": "難波店", "order_id": 5022, "urgent": False}
# json.dumps で、別のプログラムに送れる文字列にします。
text = json.dumps(order, ensure_ascii=False)
print(text)
# やってみましょう: "note" というキーに "朝便で配送" を加えて、
# もう一度実行してください。
YAML は字下げで形を表す
YAML は、JSON と同じデータを、人が読みやすい形で書きます。だから設定ファイルによく使われます。
一行に キー: 値 を書きます。行の先頭の - は、リストの一つの値です。
入れ子は字下げ、つまり行の先頭の空白で表します。空白が一つずれると、意味が変わります。
設定ファイルを読む
# 配送サービスの設定ファイルを作ります。
cat > delivery.yaml <<'END'
service: delivery
port: 8080
debug: false
warehouses:
- 大阪南港
- 神戸
contact:
name: 物流チーム
phone: 06-0000-0000
END
cat delivery.yaml
# やってみましょう: grep で port の行だけを表示してください。