Python · dict · JSON anidado

Convertir recursivamente claves dict Python a camelCase

Una función de string no basta para dict/list anidados; convierte claves en el límite de datos y falla ante colisiones.

Por Equipo editorial de Camel Case ConverterPublicado 12 sept 2026Última revisión

Convertir recursivamente claves dict y list

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

Procesa listas antes que dict, conserva escalares y reconstruye dict con claves string camelCase.

Usar el convertidor tras parsear JSON

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

json.loads produce dict/list normales y ofrece un límite claro y fácil de probar.

Preservar prefijos underscore o dollar si hace falta

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)

Para _id, __typename o $schema_version, separa el prefijo antes de convertir el resto.

Consideraciones de producción

  • Decide cómo tratar underscores repetidos y tokens vacíos.
  • Una colisión user_id / userId debe lanzar error.
  • Usa exclusiones o stop paths si solo parte del payload debe convertirse.
  • Dataclasses, ORM, modelos o serializers pueden ser un límite mejor según la app.

Probar el límite JSON online

Prueba objetos anidados, arrays, exclusiones, stop paths, prefijos, colisiones y diff de claves antes de implementar.

Suelta un archivo .json o elige uno de tu dispositivo

Los archivos se leen solo en tu navegador. Tamaño máximo: 5 MB.

JSON convertido
{
  "userProfile": {
    "firstName": "Ada",
    "createdAt": "2026-09-12"
  }
}

El análisis, lectura de archivos, formato y conversión se ejecutan localmente en tu navegador. El JSON no se envía a un servidor de conversión.