Python | 1 日 120 分 × 7 日アプリ学習:JSON保存アプリ(中級編)

Web APP Python
スポンサーリンク

1日目のゴール

1日目のテーマは
「JSONって何者かを理解して、Pythonで“とりあえず保存して読み戻す”ところまでできるようになること」
です。

今日はまだ「アプリ」までは行きません。
でも、ここで学ぶ

  • JSONというデータ形式のイメージ
  • Pythonのdict / listとJSONの対応関係
  • json.dump / json.loadでの保存・読み込み

この3つが、残り6日間のすべての土台になります。


JSONとは何かをイメージでつかむ

人間にも読めて、プログラムにも扱いやすい「データの箱」

JSONは、ざっくり言うと
「データをテキストで保存するためのルール」 です。

例えば、こんな情報があるとします。

  • 名前: Taro
  • 年齢: 25

これを日本語で書くと

名前: Taro, 年齢: 25

ですが、コンピュータにとっては
「どこからどこまでが名前で、どこからが年齢なのか」
が分かりにくい。

そこで、JSONではこう書きます。

{
  "name": "Taro",
  "age": 25
}

これなら、

  • "name" という項目に "Taro"
  • "age" という項目に 25

が入っている、と機械的に判断できます。

しかも、人間が読んでも意味が分かる。
これがJSONの強みです。


Pythonのdict / listとJSONの関係

「Pythonの世界」と「ファイルの世界」をつなぐ橋

Pythonでデータを扱うとき、よく出てくるのが

  • dict(辞書)
  • list(リスト)

です。

例えば、1人のユーザーをPythonで表すとこうなります。

user = {
    "name": "Taro",
    "age": 25
}
Python

複数のユーザーなら、こうです。

users = [
    {"name": "Taro", "age": 25},
    {"name": "Hanako", "age": 30}
]
Python

これをJSONにすると、ほぼそのままの形で保存できます。

[
  {"name": "Taro", "age": 25},
  {"name": "Hanako", "age": 30}
]

ここで超重要なのは、

「Pythonのdict/listとJSONのオブジェクト/配列は、ほぼ1対1で対応している」

ということです。

  • Pythonのdict → JSONの { ... }
  • Pythonのlist → JSONの [ ... ]
  • Pythonのstr → JSONの文字列
  • Pythonのint / float → JSONの数値
  • PythonのTrue / False → JSONの true / false
  • PythonのNone → JSONの null

この対応関係さえ覚えれば、
「PythonのデータをそのままJSONに保存する」
という感覚がつかめます。


なぜCSVではなくJSONなのか

「表形式」か「構造を持ったデータ」か

中級編のタイトルに「CSVファイル読み書きアプリ」とありますが、
ここではあえてJSONを扱います。

CSVは「表形式のデータ」に向いています。

name,age
Taro,25
Hanako,30

一方で、JSONは

  • 項目が増えたり減ったりしても対応しやすい
  • 入れ子構造(中にさらにオブジェクトや配列)を持てる
  • Web APIなどでも標準的に使われている

という特徴があります。

アプリで「ちょっと複雑なデータ」を扱いたくなったとき、
JSONはとても相性がいい形式です。


PythonでJSONを扱うための基本関数

jsonモジュールを使う

Pythonには、最初からJSONを扱うためのモジュールが用意されています。

import json
Python

このjsonモジュールには、主に次の4つの関数があります。

  • json.dump : Pythonのデータ → ファイルに書き出す
  • json.load : ファイル → Pythonのデータに読み込む
  • json.dumps : Pythonのデータ → JSON文字列に変換
  • json.loads : JSON文字列 → Pythonのデータに変換

1日目では、まず

  • json.dump
  • json.load

の2つに集中します。


まずは「1つのオブジェクト」を保存してみる

超シンプルな例:設定ファイルっぽいもの

たとえば、アプリの設定を保存したいとします。

  • ユーザー名
  • ダークモードかどうか
  • 文字サイズ

これをPythonで表すとこうです。

settings = {
    "username": "taro",
    "dark_mode": True,
    "font_size": 14
}
Python

これを settings.json に保存してみましょう。

import json

settings = {
    "username": "taro",
    "dark_mode": True,
    "font_size": 14
}

with open("settings.json", "w", encoding="utf-8") as f:
    json.dump(settings, f, ensure_ascii=False, indent=2)
Python

ここでのポイントを深掘りします。

ensure_ascii=False と indent=2 の意味

json.dump の引数でよく使うのが

  • ensure_ascii=False
  • indent=2

の2つです。

ensure_ascii=False は、
日本語をそのままの形で保存するための指定です。
これを付けないと、日本語が \uXXXX のような形にエスケープされてしまい、
ファイルを開いたときに読みにくくなります。

indent=2 は、
JSONを見やすく整形してくれます。

例えば、上のコードで保存された settings.json はこうなります。

{
  "username": "taro",
  "dark_mode": true,
  "font_size": 14
}

人間が見ても分かりやすいですよね。
「JSONは人間が読めるデータ形式」 という感覚を、ここでつかんでほしいです。


保存したJSONを読み戻してみる

json.loadでPythonの世界に戻す

さきほど保存した settings.json を、
別のPythonコードから読み込んでみます。

import json

with open("settings.json", "r", encoding="utf-8") as f:
    settings = json.load(f)

print(settings)
print(type(settings))
Python

実行すると、こんな感じになります。

{'username': 'taro', 'dark_mode': True, 'font_size': 14}
<class 'dict'>
Python

つまり、

  • JSONファイル → Pythonのdictに戻ってきた

ということです。

ここが今日いちばん大事なポイントです。

「Pythonのdict/listをJSONに保存して、またdict/listとして戻せる」

これができるからこそ、
アプリの「状態」を丸ごとファイルに保存できるようになります。


1日目のミニ練習:お気に入りの本リストを保存する

複数データをJSONにしてみる

今度は、複数の本の情報を保存してみましょう。

1冊の本を、こういう形で表すことにします。

  • title(タイトル)
  • author(著者)
  • pages(ページ数)

Pythonではこうです。

book1 = {"title": "独学プログラマー", "author": "コーリー", "pages": 300}
book2 = {"title": "リーダブルコード", "author": "Dustin", "pages": 250}
Python

複数冊をリストにします。

books = [
    {"title": "独学プログラマー", "author": "コーリー", "pages": 300},
    {"title": "リーダブルコード", "author": "Dustin", "pages": 250}
]
Python

これを books.json に保存します。

import json

books = [
    {"title": "独学プログラマー", "author": "コーリー", "pages": 300},
    {"title": "リーダブルコード", "author": "Dustin", "pages": 250}
]

with open("books.json", "w", encoding="utf-8") as f:
    json.dump(books, f, ensure_ascii=False, indent=2)
Python

books.json を開くと、こうなります。

[
  {
    "title": "独学プログラマー",
    "author": "コーリー",
    "pages": 300
  },
  {
    "title": "リーダブルコード",
    "author": "Dustin",
    "pages": 250
  }
]

そして、読み戻すコードはこうです。

import json

with open("books.json", "r", encoding="utf-8") as f:
    books = json.load(f)

for book in books:
    print(f"{book['title']} / {book['author']} / {book['pages']}ページ")
Python

実行すると、こんな表示になります。

独学プログラマー / コーリー / 300ページ
リーダブルコード / Dustin / 250ページ

ここまでできたら、
「JSONを使って、複数データを保存して読み戻す」
という1日目のゴールはクリアです。


1日目で絶対に押さえてほしいこと

キーワードを一気に整理する

今日の本質を、ぎゅっとまとめるとこうなります。

  • JSONは「人間にも読めて、プログラムにも扱いやすいデータ形式」
  • Pythonのdict / listとJSONのオブジェクト / 配列はほぼ1対1で対応している
  • json.dump / json.loadで「Pythonのデータ ↔ JSONファイル」を行き来できる
  • ensure_ascii=Falseindent=2 で「読めるJSON」を出力できる

この4つが、残り6日間のすべての土台です。


次の日へのつながり

2日目では、
「JSONに“アプリのデータ”を保存して、起動時に復元する」
という、いよいよ「アプリっぽい」流れに入っていきます。

今日やった

  • dict / list でデータを持つ
  • JSONに保存する
  • JSONから読み戻す

この3ステップを、
「ユーザーが入力したデータ」に対して行う形に発展させていきます。

もしよかったら、
今のうちに自分の好きなデータ(映画リスト、ゲームリスト、行きたい場所リストなど)で
xxx.json を作って遊んでみてください。
それがそのまま、明日以降の“あなた専用アプリ”の素材になります。

タイトルとURLをコピーしました