Python · dict · JSON aninhado
Converter recursivamente chaves de dict Python para camelCase
Uma função de string não basta para dict/list aninhados; converta chaves na fronteira de dados e falhe em colisões.
Converter recursivamente chaves dict e 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 outputTrate listas antes de dicts, preserve escalares e reconstrua dicts com chaves string camelCase.
Usar o conversor depois de 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 produz dict/list comuns e cria uma fronteira clara e testável.
Preservar prefixos underscore ou dollar quando necessário
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 ou $schema_version, separe o prefixo antes de converter o restante.
Considerações de produção
- Decida como tratar underscores repetidos e tokens vazios.
- Uma colisão user_id / userId deve gerar erro.
- Use exclusões ou stop paths se apenas parte do payload precisar de conversão.
- Dataclasses, ORM, modelos ou serializers podem ser uma fronteira melhor conforme a app.
Testar a fronteira JSON online
Teste objetos aninhados, arrays, exclusões, stop paths, prefixos, colisões e diff de chaves antes de implementar.
Solte um arquivo .json ou escolha no dispositivo
Arquivos são lidos apenas no navegador. Tamanho máximo: 5 MB.
{
"userProfile": {
"firstName": "Ada",
"createdAt": "2026-09-12"
}
}Parsing, leitura de arquivo, formatação e conversão rodam localmente no navegador. O JSON não é enviado a um servidor de conversão.