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 undict
, si c'est une chaîne, je n'ai pas accès à lalist
(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
list
s 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 dansjson.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
Vous devez vous connecter pour publier un commentaire.
Écrire votre propre sérialiseur JSON:
De sortie:
JSONEncoder
est une bonne approche pour la sérialisation des objets et de types de ne pas support de par défaut - mais pas tellement pour annuler la façon dont il traite ceux il ne.None
s en'null'
s.'"' + o + '"'
au lieu derepr(o)
? ne serait-il pas de se briser si le str contenir"
?repr
retour apostrophe, mais ce que j'ai dit est toujours debout. par exemple:to_json({'test':'"'})
>'{\n "test": """\n}'
J'ai fini par utiliser jsbeautifier:
De sortie:
Une autre alternative est
print json.dumps(d, indent = None, separators=(',\n', ': '))
La sortie sera:
Notez que bien que les docs officielles à https://docs.python.org/2.7/library/json.html#basic-usage dire la valeur par défaut arguments sont
separators=None
--qui signifie en fait "utiliser la valeur par défaut deseparators=(', ',': ')
). Notez également que la virgule de séparation ne fait pas la distinction entre k/v paires et les éléments de la liste.[1, 2, 3]
en une seule ligne au lieuPeut-être pas tout à fait aussi efficace, mais considérer un cas plus simple (un peu testé en Python 3, mais probablement de travail en Python 2):
Cela pourrait vous donner quelques idées, bref de la rédaction de votre propre sérialiseur complètement. J'ai utilisé mon propre favori tiret technique, et codée en dur ensure_ascii, mais vous pouvez ajouter des paramètres et de les transmettre, ou votre propre code, etc.
Ce qui a été m'énerve pour un certain temps en tant que bien, j'ai trouvé un 1 liner, je suis presque heureux avec:
Que l'essentiel de convertir toutes les listes ou les tuples d'une chaîne de caractères, puis utilise json.dumps avec tiret pour formater le dict. Ensuite, vous avez juste besoin d'enlever les guillemets, et vous avez terminé!
Remarque: - je convertir le dict de la chaîne de convertir facilement toutes les listes et les tuples n'importe comment imbriqués les dict est.
PS. J'espère que le Python de la Police ne viendra pas après moi pour l'utilisation de eval... (à utiliser avec précaution)