web-dev-qa-db-fra.com

Python encodage JSON

J'essaie de coder des données au format JSON dans Python et j'ai eu pas mal de problèmes. Je pense que le problème est simplement un malentendu.

Je suis relativement nouveau dans Python et je ne me suis jamais vraiment familiarisé avec les divers types de données Python, ce qui est probablement ce qui me dérange.

Actuellement, je déclare une liste, passe en boucle et une autre liste et ajoute une liste à une autre:

import simplejson, json
data = [['Apple', 'cat'], ['banana', 'dog'], ['pear', 'fish']]

x = simplejson.loads(data)
# >>> typeError: expected string or buffer..

x = simplejson.dumps(stream)
# >>> [["Apple", "cat"], ["banana", "dog"], ["pear", "fish"]]
# - shouldn't JSON encoded strings be like: {{"Apple":{"cat"},{"banana":"dog"}}

Donc je non plus:

  • Je ne comprends pas la syntaxe JSON
  • Je ne comprends pas les modules JSON Pythons
  • J'utilise un type de données inapproprié.
51
KeyboardInterrupt

Python lists traduit en JSON arrays. Cela vous donne une chaîne JSON parfaitement valide qui pourrait être utilisée dans une application Javascript. Pour obtenir ce que vous attendiez, vous auriez besoin d'utiliser un dict:

>>> json.dumps({'Apple': 'cat', 'banana':'dog', 'pear':'fish'})
'{"pear": "fish", "Apple": "cat", "banana": "dog"}'
67
Paolo Bergantino

Je pense que vous échangez simplement dumps et charges.

>>> import json
>>> data = [['Apple', 'cat'], ['banana', 'dog'], ['pear', 'fish']]

Le premier retourne sous forme de chaîne (codée JSON) son argument de données:

>>> encoded_str = json.dumps( data )
>>> encoded_str
'[["Apple", "cat"], ["banana", "dog"], ["pear", "fish"]]'

La seconde fait le contraire, renvoyant les données correspondant à son argument de chaîne (codé JSON):

>>> decoded_data = json.loads( encoded_str )
>>> decoded_data
[[u'Apple', u'cat'], [u'banana', u'dog'], [u'pear', u'fish']]
>>> decoded_data == data
True
20
Mapio

Dans simplejson (ou la bibliothèque json dans Python 2.6 et versions ultérieures), loads prend une chaîne JSON et renvoie une structure de données Python, dumps prend une structure de données Python et renvoie une chaîne JSON. La chaîne JSON peut coder des tableaux Javascript, pas seulement des objets, et une liste Python correspond à une chaîne JSON codant un tableau. Pour obtenir une chaîne JSON telle que

{"Apple":"cat", "banana":"dog"}

l'objet Python que vous passez à json.dumps pourrait être:

dict(Apple="cat", banana="dog")

bien que la chaîne JSON soit également une syntaxe valide Python pour le même dict. Je pense cependant que la chaîne spécifique que vous attendez est tout simplement une syntaxe JSON non valide.

17
Alex Martelli

Les données que vous encodez étant un tableau sans clé, JSON les encode avec des crochets []. Voir www.json.org pour plus d'informations à ce sujet. Les accolades sont utilisées pour les listes avec des paires clé/valeur.

De www.json.org:

JSON est construit sur deux structures:

Une collection de paires nom/valeur. Dans différentes langues, ceci est réalisé sous forme d'objet, d'enregistrement, de structure, de dictionnaire, de table de hachage, de liste à clé ou de tableau associatif. Une liste ordonnée de valeurs. Dans la plupart des langues, cela est réalisé sous forme de tableau, de vecteur, de liste ou de séquence.

Un objet est un ensemble non ordonné de paires nom/valeur. Un objet commence par {(accolade gauche) et se termine par} (accolade droite). Chaque nom est suivi de: (deux points) et les paires nom/valeur sont séparées par, (virgule).

Un tableau est une collection ordonnée de valeurs. Un tableau commence par [(crochet de gauche) et se termine par] (crochet de droite). Les valeurs sont séparées par, (virgule).

4
ylebre

JSON utilise des crochets pour les listes ([ "one", "two", "three" ]) et des accolades pour les dictionnaires clé/valeur (également appelés objets en JavaScript, {"one":1, "two":"b"}).

Le vidage est tout à fait correct, vous obtenez une liste de trois éléments, chacun étant une liste de deux chaînes.

si vous vouliez un dictionnaire, peut-être quelque chose comme ça:

x = simplejson.dumps(dict(data))
>>> {"pear": "fish", "Apple": "cat", "banana": "dog"}

votre chaîne attendue ('{{"Apple":{"cat"},{"banana":"dog"}} ') n'est pas valide JSON. UNE

3
Javier

Donc, simplejson.loads prend une chaîne json et retourne une structure de données, ce qui explique pourquoi vous obtenez cette erreur de type ici.

simplejson.dumps (data) revient avec

'[["Apple", "cat"], ["banana", "dog"], ["pear", "fish"]]'

Ce qui est un tableau JSON, ce que vous voulez, puisque vous lui avez donné un tableau python.

Si vous voulez obtenir une syntaxe de type "objet", vous feriez plutôt

>>> data2 = {'Apple':'cat', 'banana':'dog', 'pear':'fish'}
>>> simplejson.dumps(data2)
'{"pear": "fish", "Apple": "cat", "banana": "dog"}'

qui est javascript va sortir comme un objet.

3
emeryc

Essayer:

import simplejson
data = {'Apple': 'cat', 'banana':'dog', 'pear':'fish'}
data_json = "{'Apple': 'cat', 'banana':'dog', 'pear':'fish'}"

simplejson.loads(data_json) # outputs data
simplejson.dumps(data) # outputs data_joon

NB: Basé sur la réponse de Paolo.

3
Tom Leys