2012-04-29 3 views
0

J'ai de la difficulté à analyser une chaîne json qui semble être valide json.Erreur lors de l'analyse de la chaîne JSON

Mon code est le suivant. J'essaye d'attraper un simple json d'une URL.

import urllib2  
import simplejson 
req = urllib2.Request("http://www.rentrent.org/RENT/Ads.aspx?xmin=-118.01925659179687&ymin=33.71948521132481&xmax=-117.68142700195314&ymax=33.85644642218431&bd=&ba=&pets=-1&type=2&throwErrorIfOverLimit=false&callback=xxx") 

opener = urllib2.build_opener()  
f = opener.open(req)  
content = f.read();  
print "content = " + content # Appears to print valid json string 
json = simplejson.loads(content) 

je reçois une erreur sur simplejson.loads(content):

raise JSONDecodeError("No JSON object could be decoded", s, idx) 
simplejson.decoder.JSONDecodeError: No JSON object could be decoded: line 1 column 0 (char 0) 

Ceci est source de confusion car content semble être une très bonne chaîne JSON.

Je dois accéder à ces données en tant qu'éléments individuels. Des idées pour se débarrasser de cette erreur?

+3

Pouvez-vous poster la Réponse JSON? – Blender

+1

Vous pouvez vous débarrasser de l'erreur en lui donnant un JSON valide, ou en ignorant l'échec. Besoin de voir JSON. – jdi

+0

Je voulais corriger mon dernier commentaire en disant que nous n'avons pas besoin de voir le json à ce stade. J'ai regardé l'URL et j'ai vu les données, bien que ce soit commode pour tout le monde si un extrait est posté ici. – jdi

Répondre

3

Ceci est une adresse URL de jsonp. Il s'attend à vous renvoyer une réponse enveloppée dans un appel de fonction xxx(). Regardez comment gérer jsonp. Ce que vous obtenez actuellement n'est pas réellement valide jsonp. Son javascript valide.

Voici une autre question sur la différence:
What are the differences between JSON and JSONP?

Vous pouvez retirer le param de rappel de votre url et retourner pur JSON:
http://www.rentrent.org/RENT/Ads.aspx?xmin=-118.01925659179687&ymin=33.71948521132481&xmax=-117.68142700195314&ymax=33.85644642218431&bd=&ba=&pets=-1&type=2&throwErrorIfOverLimit=false

Mise à jour

Je négligé que supprimer le paramètre callback de l'URL ne dit pas à cette API de retourner JSON. Cela l'empêche seulement d'être enveloppé dans une fonction. La valeur de retour n'est toujours pas json. C'est javascript. Pour être plus précis, voici un exemple:

Javascript de la valeur de retour

{Status:'Success', 

JSON

{'Status':'Success', 

Toutes les clés doivent être cités. Vos options sont soit:

  1. Voir si l'API prend en charge une valeur de retour JSON au lieu de jsonp
  2. Faites une solution regex sur la sortie de citer toutes les clés avant le décodage
+0

Merci! Je vois comment il n'est plus enveloppé dans un appel de fonction. Cependant, il ne sera toujours pas analyser. J'obtiens un 'raise JSONDecodeError (" Expecting property name ", s, fin) simplejson.decoder.JSONDecodeError: Attend nom de la propriété: ligne 1 colonne 1 (char 1)' Est-ce que cette URL retourne un json valide ou suis-je l'analyser incorrectement ? – codingJoe

+0

Certaines API (comme celle de Stripe par exemple) retourneront JSONP si l'argument de rappel est fourni, sinon JSON. – btk

Questions connexes