2017-10-14 1 views
0

Avec json.dumps(some_dict,indent=4,sort_keys=True) dans mon code:JSON - forcer chaque ouverture accolade à apparaître dans une nouvelle ligne distincte

je reçois quelque chose comme ceci:

{ 
    "a": { 
     "x":1, 
     "y":2 
    }, 
    "b": { 
     "z":3, 
     "w":4 
    } 
} 

Mais je veux quelque chose comme ceci:

{ 
    "a": 
    { 
     "x":1, 
     "y":2 
    }, 
    "b": 
    { 
     "z":3, 
     "w":4 
    } 
} 

Comment puis-je forcer chaque accolade ouvrante à apparaître au début d'une nouvelle ligne séparée?

Dois-je écrire mon propre sérialiseur JSON ou y a-t-il un argument spécial que je peux utiliser lorsque j'appelle json.dumps?

Merci.

+1

Je ne pense pas que quelqu'un écrit JSON comme ça. Pourquoi en avez-vous besoin? – Barmar

+0

Vous pouvez utiliser le 'json.dumps()' existant, puis le post-traiter pour rechercher ': {' et remplacer l'espace par newline et le nombre d'espaces approprié. – Barmar

Répondre

1

Vous pouvez utiliser un remplacement d'expression régulière sur le résultat.

better_json = re.sub(r'^((\s*)".*?":)\s*([\[{])', r'\1\n\2\3', json, flags=re.MULTILINE) 

Le premier groupe de capture correspond tout à la : après le nom de la propriété, le deuxième groupe de capture correspond au espace avant le nom de la propriété, et le troisième groupe de capture capture le { ou [ avant que l'objet ou un tableau. Les espaces sont ensuite copiés après la nouvelle ligne, de sorte que l'indentation correspondra correctement.

DEMO

+0

Merci beaucoup !!! Et j'ai réalisé que j'en avais aussi besoin pour les accolades carrées. Est-ce que j'ajoute simplement '\ [' à côté de chaque '\ {' de votre ligne de code? – goodvibration

+0

@goodvibration Vous pouvez utiliser [\ [{] 'pour faire correspondre les accolades ouvrantes et les accolades. Vous devrez le placer dans un autre groupe de capture afin de pouvoir le copier sur le remplacement. – Barmar

+0

J'ai mis à jour la réponse et la démo. – Barmar