構造化データの軽量交換フォーマット
データを「分析・モデリングに使える形に整える」工程。 分析の質はここで 8 割決まります。
本ページでは JSON を、 定義・前提条件・使い方・落とし穴の順に整理して解説します。 厳密な定義より、 まず何を、 いつ、 どう使うかを理解することを優先してください。
構造化データの軽量交換フォーマット
英語名 JavaScript Object Notation。
この用語を理解・使用するときは、 次のような前提を意識してください:
SSDSE-B-2026 のような公的統計データを Python で扱う際の基本パターン:
1 2 3 4 5 6 7 8 9 10 11 12 | import pandas as pd import numpy as np # データ読み込み df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1) print(df.shape) print(df.dtypes) print(df.describe()) # 「JSON」の文脈で扱う場合の例: # 分野: データエンジニアリング # 関連手法は同カテゴリの他用語を参照してください。 |
具体的なコードは データエンジニアリング を参照してください。
分析結果を報告するときに含めるべき情報:
SSDSE-B-2026 は CSV だが、 Web API では JSON が事実上の標準。 e-Stat の API レスポンスも JSON。 同じ都道府県データを JSON 化するとこうなる:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | {
"metadata": {
"source": "SSDSE-B-2026",
"year": 2023,
"rows": 47,
"encoding": "utf-8"
},
"data": [
{"code": "R13000", "prefecture": "東京都",
"population": 14086000, "aged_pop": 3205000,
"aged_ratio": 22.75},
{"code": "R01000", "prefecture": "北海道",
"population": 5092000, "aged_pop": 1681000,
"aged_ratio": 33.01},
{"code": "R47000", "prefecture": "沖縄県",
"population": 1470000, "aged_pop": 348000,
"aged_ratio": 23.67}
]
}
|
CSV と比較した特徴:
| 観点 | CSV | JSON |
|---|---|---|
| 階層構造 | 平坦のみ | ネスト可 |
| 型情報 | 全て文字列 | 数値・真偽・null 区別 |
| スキーマ | 暗黙的 | JSON Schema で記述可 |
| サイズ | 小さい | キー名繰り返しで大きい |
| 可読性 | 表形式向き | ネスト向き |
| Web API | ファイル添付 | レスポンスボディ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # pandas → JSON 変換
import pandas as pd
import json
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
df = df[df['年度']==2023][['地域コード','都道府県','総人口','65歳以上人口']]
df.columns = ['code','prefecture','population','aged_pop']
df['aged_ratio'] = (df['aged_pop']/df['population']*100).round(2)
# orient='records' で配列の各要素が 1 都道府県
records = df.to_dict(orient='records')
out = {'metadata': {'source':'SSDSE-B-2026','year':2023,'rows':len(df)},
'data': records}
with open('ssdse_b_2023.json','w',encoding='utf-8') as f:
json.dump(out, f, ensure_ascii=False, indent=2)
# 読み込み
with open('ssdse_b_2023.json',encoding='utf-8') as f:
loaded = json.load(f)
print(loaded['data'][0]) # {'code':'R01000','prefecture':'北海道',...}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | # JSON Schema で型と必須項目を検証
import jsonschema, json
schema = {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"required": ["code","prefecture","population"],
"properties": {
"code": {"type":"string","pattern":"^R\\d{5}$"},
"prefecture": {"type":"string"},
"population": {"type":"integer","minimum":0},
"aged_pop": {"type":"integer","minimum":0},
"aged_ratio": {"type":"number","minimum":0,"maximum":100}
}
}
}
}
}
with open('ssdse_b_2023.json',encoding='utf-8') as f:
data = json.load(f)
jsonschema.validate(data, schema)
print('Schema OK')
|
| フォーマット | 特徴 | 用途 |
|---|---|---|
| JSON | 標準 | Web API |
| JSON Lines (NDJSON) | 1 行 1 オブジェクト | BigQuery, ログ |
| JSON5 | コメント・末尾カンマOK | 設定ファイル |
| BSON | バイナリ JSON | MongoDB |
| MessagePack | コンパクト | モバイル通信 |
| JSON-LD | リンクトデータ | Schema.org, SEO |