Python · dict · JSON imbriqué
Convertir récursivement les clés dict Python en camelCase
Une fonction de chaîne ne suffit pas aux dict/list imbriqués ; convertissez les clés à la frontière des données et échouez en cas de collision.
Convertir récursivement les clés dict et 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 outputTraitez les listes avant les dict, conservez les scalaires et reconstruisez les dict avec des clés string camelCase.
Utiliser le convertisseur après l’analyse 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 produit dict et list, ce qui fournit une frontière claire et testable.
Préserver les préfixes underscore ou dollar si nécessaire
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)Pour _id, __typename ou $schema_version, séparez le préfixe avant de convertir le reste du nom.
Points d’attention en production
- Décidez comment traiter underscores répétés et tokens vides.
- Une collision user_id / userId doit lever une erreur.
- Utilisez exclusions ou stop paths si seule une partie du payload doit être convertie.
- Dataclasses, ORM, modèles ou serializers peuvent offrir une meilleure frontière selon l’application.
Tester la frontière JSON en ligne
Testez objets imbriqués, tableaux, exclusions, stop paths, préfixes, collisions et diff de clés avant l’implémentation.
Déposez un fichier .json ou choisissez-en un sur votre appareil
Les fichiers sont lus uniquement dans votre navigateur. Taille maximale : 5 Mo.
{
"userProfile": {
"firstName": "Ada",
"createdAt": "2026-09-12"
}
}Analyse, lecture de fichier, formatage et conversion s’exécutent localement dans votre navigateur. Le JSON n’est pas envoyé à un serveur de conversion.