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.

Par Équipe éditoriale Camel Case ConverterPublié le 12 sept. 2026Dernière relecture

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 output

Traitez 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.

JSON converti
{
  "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.