Jolie impression JSON dumps

J'utilise ce code pour la jolie imprimer un dict en JSON:

import json
d = {'a': 'blah', 'b': 'foo', 'c': [1,2,3]}
print json.dumps(d, indent = 2, separators=(',', ': '))

De sortie:

{
  "a": "blah",
  "c": [
    1,
    2,
    3
  ],
  "b": "foo"
}

C'est un peu trop (retour à la ligne pour chaque élément de la liste!).

Qui la syntaxe dois-je utiliser pour avoir ceci:

{
  "a": "blah",
  "c": [1, 2, 3],
  "b": "foo"
}

à la place?

  • Ce n'est pas exactement la réponse à votre question, mais si vous êtes simplement à la recherche d'un format de données qui est facile sur les yeux, vous pouvez essayer de YAML. Il existe deux syntaxes pour les collections, tout comme les listes et les dictionnaires, "block" (où l'indentation montre l'imbrication) et de "flux" (où les crochets de faire ce travail). Par défaut, la sortie de PyYAML utilise des "flux" de la syntaxe pour les listes et les dictionnaires qui ne contiennent pas d'autres conteneurs, ce qui sonne comme exactement ce que vous voulez pour votre jolie impression.
  • Merci @Blckknght. Est YAML mature/stable/portable et devraient être disponibles dans les années à venir/les futures versions de python? Est-ce que ça va être une norme? (désolé pour toutes ces questions 😉 )
  • Une autre remarque: je voulais éviter de conversion en chaîne de caractères, parce que quand je load mon fichier JSON dans un dict, si c'est une chaîne, je n'ai pas accès à la list (ou j'en aurais besoin pour analyser la chaîne dans la liste, mais c'est une honte d'avoir à le faire ...)
  • Il doit bien y avoir un moyen de le faire en sous-classement json.JSONEncoder, mais je n'ai pas pensé à elle.
  • Je ne suis pas vraiment un YAML expert, mais ma compréhension est qu'il est assez stable et mature, bien que pas aussi largement utilisé comme JSON. Vous pouvez trouver ses normes dans le le site officiel YAML, si le Wikipédia, semble tout à fait un peu mieux à donner un aperçu. JSON est un sous-ensemble de la dernière version de YAML (et les incompatibilités avec les anciennes YAML versions étaient apparemment rarement rencontré).
  • C'est l'affichage des lists la seule mise en forme que vous souhaitez personnaliser (par rapport à la table dans la documentation montrant l'defualt Python les types intégrés dans json.JSONEncoder classe poignées)?
  • oui list est la seule mise en forme je veux personnaliser
  • Ce qui doit arriver, l'indentation-sage, si la liste contient un dictionnaire ou d'une autre liste, etc?
  • les deux solutions serait bien pour moi (c'est à dire de nouvelles lignes pour chaque sous-liste de la liste, ou pas de nouvelle ligne à tous)
  • AFAICT il n'y a pas un moyen raisonnable de faire cela avec le haut- JSONEncoder classe directement ou sous-classement, ou même d'un singe, il correctifs qui réponde à vos besoins. Ainsi, vous aurez probablement besoin d'écrire votre propre, comme @Shan Valleru suggère.
  • json n'est pas le seul module qui permet de gérer cela pour vous. Peut-être il ya une raison, ce n'était pas mentionné, j'avoue que je ne suis pas un python gars. docs.python.org/3.2/library/pprint.html#module-pprint

InformationsquelleAutor Basj | 2014-02-18