Bibliothèque Python pour écrire JSON au coup par coup

jwodder

Bibliothèque Python pour écrire JSON au coup par coup


Je recherche une bibliothèque Python 2 pour sérialiser des valeurs en JSON qui ne nécessite pas que la valeur entière soit calculée et en mémoire avant la sérialisation. Je préférerais quelque chose de streaming / basé sur des événements (comme ijson mais en sens inverse), mais je me contenterais également de quelque chose qui puisse sérialiser sérieusement les générateurs en listes.

Exemple d’utilisation simple:

 with open('outfile.json', 'w') as outfile: with magic_json_library.begin_object(outfile) as obj: obj.set_key("foo", 3.14) obj.begin_list(key="stuff") for item in retrieve_values_from_large_database(): obj.append(item) obj.end_list() obj.begin_object(key="about_stuff") for field, value in retrieve_mapping_from_large_website(): obj.add_key(field, value) obj.end_object() 

Réponses


 tylerl

Les règles de codage de JSON sont vraiment, vraiment simples. La majorité de l’effort impliqué dans l’écriture d’un codec JSON consiste à gérer la nature arbitrairement récursive des objets et à organiser la représentation de la sortie (par exemple, trier les clés, etc.).

Mais dans votre cas, avec un moteur de sortie en streaming, une grande partie (sinon la totalité) de cette complexité disparaît, et tout ce qui reste est le formatage de base et l’exactitude.

J’imagine que vous pourriez écrire un tel outil en moins de 100 lignes. Des fonctions comme begin_list sont plus ou moins aussi simples que print "[" , plus une maintenance d’état pour des garanties de précision. Les types de données sont simples à représenter, les règles d’échappement sont simples. Il n’y a vraiment rien.

Jetez un œil à encoder.py de simplejson pour avoir une idée de tout ce qui se passe dans l’écriture d’un encodeur JSON complet. Vous serez surpris du peu de choses à faire.

 

#au, #pour, bibliothèque, coup, écrire, JSON?, par, Python

 

wiki

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *