論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
JSON
JavaScript Object Notation
データエンジニアリング

💡 30秒で分かる結論

構造化データの軽量交換フォーマット

🎨 直感で掴む

データを「分析・モデリングに使える形に整える」工程。 分析の質はここで 8 割決まります。

本ページでは JSON を、 定義・前提条件・使い方・落とし穴の順に整理して解説します。 厳密な定義より、 まず何を、 いつ、 どう使うかを理解することを優先してください。

📐 定義

構造化データの軽量交換フォーマット

英語名 JavaScript Object Notation

🎯 いつ・どこで使うか

📋 前提条件・適用範囲

この用語を理解・使用するときは、 次のような前提を意識してください:

⚠️ よくある落とし穴

❌ テスト時の未知カテゴリ
OneHotEncoder(handle_unknown="ignore") 等で対応。
❌ リーク防止
前処理は CV の各 fold 内で fit。 Pipeline を使う。
❌ 文字コード
日本語 CSV は utf-8 / cp932 を試す。

🐍 Python での扱い

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 を 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 と比較した特徴:

観点CSVJSON
階層構造平坦のみネスト可
型情報全て文字列数値・真偽・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':'北海道',...}

🔬 JSON Schema、 JSON Lines、 関連フォーマット

JSON Schema による検証

 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 系派生フォーマット

フォーマット特徴用途
JSON標準Web API
JSON Lines (NDJSON)1 行 1 オブジェクトBigQuery, ログ
JSON5コメント・末尾カンマOK設定ファイル
BSONバイナリ JSONMongoDB
MessagePackコンパクトモバイル通信
JSON-LDリンクトデータSchema.org, SEO

⚠️ JSON 取り扱いの罠

❌ 1. 整数のオーバーフロー
JavaScript の Number は 2^53 - 1 まで。 SSDSE-B の人口(数千万)は安全だが、 マイナンバーや 64bit ID は文字列で送る。
❌ 2. 浮動小数の精度
0.1 + 0.2 = 0.30000000000000004。 金額は文字列か固定小数(整数で銭単位)で表現。
❌ 3. 日付の表現が標準化されない
JSON 本体に日付型はない。 ISO 8601 文字列 (\"2023-12-31T23:59:59Z\") を慣習にする。
❌ 4. NaN / Infinity が JSON 標準にない
pandas の NaN を to_json すると null に化ける。 区別が必要なら欠損フラグ列を別に持つ。
❌ 5. UTF-8 エスケープと ensure_ascii
ensure_ascii=True だと日本語が \\u3042... になり読めない。 False を指定して UTF-8 をそのまま保持。