Python · dict · nested JSON

Python dict keys を camelCase へ再帰変換

ネストした dict/list には文字列 helper だけでは不十分です。data boundary で再帰変換し、値を保持し、衝突時は失敗させます。

Camel Case Converter 編集チーム 著公開日 2026/09/12最終レビュー

dict と list の key を再帰変換

from typing import Any

def snake_to_camel(name: str) -> str:
    parts = [part for part in name.split("_") if part]
    if not parts: return name
    head, *tail = parts
    return head.lower() + "".join(part[:1].upper() + part[1:].lower() for part in tail)

def keys_to_camel(value: Any) -> Any:
    if isinstance(value, list): return [keys_to_camel(item) for item in value]
    if not isinstance(value, dict): return value
    output: dict[Any, Any] = {}
    for key, child in value.items():
        next_key = snake_to_camel(key) if isinstance(key, str) else key
        if next_key in output: raise ValueError(f"Key collision: {next_key}")
        output[next_key] = keys_to_camel(child)
    return output

list を先に処理し、scalar はそのまま返し、dict は新しい camelCase string key で再構築します。

JSON parse 後に converter を適用

import json
snake_payload = json.loads(raw_json)
camel_payload = keys_to_camel(snake_payload)
print(json.dumps(camel_payload, indent=2))

json.loads が通常の dict/list を返すため、parse 直後を明確な naming boundary にできます。

必要なら underscore / dollar prefix を保持

def snake_to_camel_preserving_prefix(name: str) -> str:
    prefix_length = len(name) - len(name.lstrip("_$"))
    prefix = name[:prefix_length]
    body = name[prefix_length:]
    return prefix + snake_to_camel(body)

_id、__typename、$schema_version などは prefix を分離してから残りを変換します。

本番利用時の注意点

  • 連続 underscore と空 token を正規化するか保持するか規則を決めます。
  • user_id と userId が同じ出力 key になる場合はエラーにします。
  • payload の一部だけ変換するなら除外キーや path-aware stop rule を使います。
  • custom class、dataclass、ORM、serializer があるならそちらがより適切な naming boundary の場合があります。

JSON 境界をオンラインでテスト

ネスト、配列、除外キー、stop path、接頭辞、衝突、key-only diff をブラウザで確認できます。

.json ファイルをドロップ、または端末から選択

ファイルはブラウザ内でのみ読み取ります。最大 5 MB。

変換後 JSON
{
  "userProfile": {
    "firstName": "Ada",
    "createdAt": "2026-09-12"
  }
}

解析、ファイル読み込み、整形、キー変換はすべてブラウザ内で実行されます。JSON 入力は変換サーバーへ送信されません。