JSON.charges() ValueError de Données Supplémentaires en Python
Je suis en train de lire les valeurs individuelles à partir d'un flux JSON. Voici un exemple de flux de données:
{
"sendtoken": "token1",
"bytes_transferred": 0,
"num_retries": 0,
"timestamp": 1414395374,
"queue_time": 975,
"message": "internalerror",
"id": "mailerX",
"m0": {
"binding_group": "domain.com",
"recipient_domain": "hotmail.com",
"recipient_local": "destination",
"sender_domain": "domain.com",
"binding": "mail.domain.com",
"message_id": "C1/34-54876-D36FA645",
"api_credential": "creds",
"sender_local": "localstring"
},
"rejecting_ip": "145.5.5.5",
"type": "alpha",
"message_stage": 3
}
{
"sendtoken": "token2",
"bytes_transferred": 0,
"num_retries": 0,
"timestamp": 1414397568,
"queue_time": 538,
"message": "internal error,
"id": "mailerX",
"m0": {
"binding_group": "domain.com",
"recipient_domain": "hotmail.com",
"recipient_local": "destination",
"sender_domain": "domain.com",
"binding": "mail.domain.com",
"message_id": "C1/34-54876-D36FA645",
"api_credential": "creds",
"sender_local": "localstring"
},
"rejecting_ip": "145.5.5.5",
"type": "alpha",
"message_stage": 3
}
Je ne peux pas partager l'URL réelle, mais le ci-dessus sont les 2 premiers d'environ 150 résultats qui sont affichés, si je lance
print results
avant la
json.loads()
ligne.
Mon code:
import urllib2
import json
results = urllib2.urlopen(url).read()
jsondata = json.loads(results)
for row in jsondata:
print row['sendtoken']
print row['recipient_domain']
J'aimerais sortie comme
token1
hotmail.com
pour chaque entrée.
J'obtiens cette erreur:
ValueError: Extra data: line 2 column 1 - line 133 column 1 (char 583 - 77680)
Je suis loin d'être un expert Python, et c'est ma première fois de travailler avec JSON. J'ai passé un peu de temps à la recherche sur google et de Dépassement de Pile, mais je ne peux pas trouver une solution qui fonctionne pour mon format de données.
- Votre json n'est pas valide
Vous devez vous connecter pour publier un commentaire.
Le problème est que vos données ne forment pas un objet JSON, donc vous ne pouvez pas les décoder avec
json.loads
.Tout d'abord, ce apparaît une séquence d'objets JSON séparés par des espaces. Car vous n'aurez pas nous en dire plus sur l'endroit où proviennent les données, c'est vraiment juste une supposition éclairée; j'espère que toute documentation ou un collègue de travail ou tout ce que vous a dit à propos de cette URL vous dit que le format est en réalité. Mais admettons que ma supposition est correcte.
La façon la plus simple de parser un flux d'objets JSON en Python est d'utiliser le
raw_decode
méthode. Quelque chose comme ceci:*Cependant, il y a aussi une erreur dans le deuxième objet JSON dans le ruisseau. Regardez cette partie:
Il y a un manque
"
après"internal error
. Si vous remédier à cela, alors la fonction ci-dessus va se répéter deux objets JSON.Espérons que l'erreur a été causée par vous essayer à la main "copier-coller" données par le réécrire. Si c'est dans l'original de votre source de données, vous avez un problème beaucoup plus important; vous avez probablement besoin d'écrire un "broken JSON" analyseur à partir de zéro qui peut de manière heuristique pense à ce que les données étaient destinées à être. Ou, bien sûr, celui de la génération de la source pour générer correctement.
* En général, il est plus efficace d'utiliser le deuxième argument de
raw_decode
pour transmettre un index de début, au lieu de trancher une copie de la reste à chaque fois. Maisraw_decode
ne peut pas gérer les principaux espaces. C'est un peu facile de trancher et de bande que pour écrire du code qui saute au-dessus des espaces à partir de l'indice, mais si la mémoire et les coûts de l'exécution de ces copies, il faut écrire plus de code compliqué.C'est parce que json.les charges (et json.de charge) ne permet pas de décoder plusieurs objet json.
Par exemple, le fichier json, vous voulez peut-être:
["a": 1, "b": 2]
cependant exactement la structure de fichier du code est:
["a": 1, "b": 2]["a": 1, "b": 2]