Je reçois une erreur Expecting value: line 1 column 1 (char 0)
en essayant de décoder JSON.
L'URL que j'utilise pour l'appel d'API fonctionne bien dans le navigateur, mais donne cette erreur lorsqu'elle est effectuée via une demande de boucle. Voici le code que j'utilise pour la demande curl.
L'erreur se produit à return simplejson.loads(response_json)
response_json = self.web_fetch(url)
response_json = response_json.decode('utf-8')
return json.loads(response_json)
def web_fetch(self, url):
buffer = StringIO()
curl = pycurl.Curl()
curl.setopt(curl.URL, url)
curl.setopt(curl.TIMEOUT, self.timeout)
curl.setopt(curl.WRITEFUNCTION, buffer.write)
curl.perform()
curl.close()
response = buffer.getvalue().strip()
return response
Traceback complet:
Traceback:
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
111. response = callback(request, *callback_args, **callback_kwargs)
File "/Users/nab/Desktop/pricestore/pricemodels/views.py" in view_category
620. apicall=api.API().search_parts(category_id= str(categoryofpart.api_id), manufacturer = manufacturer, filter = filters, start=(catpage-1)*20, limit=20, sort_by='[["mpn","asc"]]')
File "/Users/nab/Desktop/pricestore/pricemodels/api.py" in search_parts
176. return simplejson.loads(response_json)
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/simplejson/__init__.py" in loads
455. return _default_decoder.decode(s)
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/simplejson/decoder.py" in decode
374. obj, end = self.raw_decode(s)
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/simplejson/decoder.py" in raw_decode
393. return self.scan_once(s, idx=_w(s, idx).end())
Exception Type: JSONDecodeError at /pricemodels/2/dir/
Exception Value: Expecting value: line 1 column 1 (char 0)
print repr(response_json)
vous dit que vous êtes passé.loads()
?simplejson
quand vous pouvez simplement utiliser le stdlibjson
(qui est la même bibliothèque quesimplejson
)?web_fetch()
appel a échoué.pycurl
.requests
offre une API beaucoup plus facile, surtout quand il s'agit de déboguer ce qui se passe. Sauf si vous devez spécifiquement avoir une version plus récente de lasimplejson
bibliothèque, restez avecjson
, vous évite une dépendance à gérer.response_json
la valeur de retour de.json()
? Vous disposez alors déjà de données décodées et vous n'avez plus besoin de les utiliserjson.loads()
.response
l'a décodé pour vous.Réponses:
Pour résumer la conversation dans les commentaires:
Il n'est pas nécessaire d'utiliser la
simplejson
bibliothèque, la même bibliothèque est incluse avec Python que lejson
module.Il n'est pas nécessaire de décoder une réponse de UTF8 en unicode, la méthode
simplejson
/json
.loads()
peut gérer les données codées UTF8 en mode natif.pycurl
a une API très archaïque. Sauf si vous avez une exigence spécifique pour l'utiliser, il existe de meilleurs choix.requests
offre l'API la plus conviviale, y compris le support JSON. Si vous le pouvez, remplacez votre appel par:la source
requests
! La trace semble suggérer que lesrequests
utilisationscomplexjson
, les utilisationssimplejson
. Bizarre.simplejson
si disponibles; certaines personnes souhaitent utiliser la dernière version de simplejson plutôt que celle fournie avec le stdlib Python.simplejson
utilise le intégréjson
sous le capot, mais donne plus d'erreurs descriptives. Dans ce cas, l'utilisationjson
vous donnerait simplement un génériqueValueError: No JSON object could be decoded
.u''
). VotreJSONDecodeError
vous indique que beaucoup de données ont été analysées avec succès avant de rencontrer une erreur; cela peut être dû au fait qu'il existe des données non valides à ce stade (document JSON mal formé ou corrompu) ou parce que les données ont été tronquées.Vérifiez le corps de données de la réponse, si des données réelles sont présentes et si un vidage de données semble être bien formaté.
Dans la plupart des cas, votre
json.loads
-JSONDecodeError: Expecting value: line 1 column 1 (char 0)
erreur est due à:En fin de compte, l'erreur vous indique qu'à la toute première position, la chaîne n'est déjà pas conforme à JSON.
En tant que tel, si l'analyse échoue malgré un corps de données qui ressemble à JSON à première vue, essayez de remplacer les guillemets du corps de données:
Remarque: les citations dans les données doivent être correctement échappées
la source
requests.get(url).json()
Just Works, le JSON n'est pas mal formé non plus.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
se produit spécifiquement lorsqu'une chaîne vide est passée au décodage jsonJSONDecodeError: Expecting value: line 1 column 1 (char 0)
se produit également lorsque la première ligne de la réponse json n'est pas valide. Exemple réponse de l' exécution d' uneaz cli
commande est["WARNING: The default kind for created storage account will change to 'StorageV2' from 'Storage' in the future", '{',
. Cela m'a donné l'erreur qui m'a conduit ici. Le reste de la réponse EST un objet json valide. Juste cette première ligne casse les choses.Avec la
requests
libJSONDecodeError
peut arriver quand vous avez un code d'erreur http comme 404 et essayez d'analyser la réponse en JSON!Vous devez d'abord vérifier 200 (OK) ou le laisser augmenter en cas d'erreur pour éviter ce cas. Je souhaite qu'il échoue avec un message d'erreur moins cryptique.
REMARQUE : comme Martijn Pieters l'a indiqué dans les commentaires, les serveurs peuvent répondre avec JSON en cas d'erreur (cela dépend de l'implémentation), donc la vérification de l'en-
Content-Type
tête est plus fiable.la source
Je pense que cela vaut la peine de mentionner que dans les cas où vous analysez le contenu d'un fichier JSON lui-même - des vérifications d'intégrité peuvent être utiles pour vous assurer que vous invoquez réellement
json.loads()
le contenu du fichier, par opposition au chemin du fichier de ce JSON :Je suis un peu gêné d'admettre que cela peut arriver parfois:
la source
json.load()
place.Vérifiez le format d'encodage de votre fichier et utilisez le format d'encodage correspondant lors de la lecture du fichier. Cela résoudra votre problème.
la source
encoding='utf-8'
, donc je suppose que parfois vous devez essayer quelques choses.Souvent, ce sera parce que la chaîne que vous essayez d'analyser est vide:
Vous pouvez y remédier en vérifiant s'il
json_string
est vide au préalable:la source
response.read()
, puis j'ai été consterné lorsqu'un autre appel a abouti,Expecting value: line 1
etc. Suppression de l'instruction de débogage et problème résolu.Il peut y avoir des 0 intégrés, même après avoir appelé decode (). Utilisez replace ():
la source
J'ai eu exactement ce problème en utilisant des demandes. Merci à Christophe Roussy pour son explication.
Pour déboguer, j'ai utilisé:
Je recevais une réponse 404 de l'API.
la source
response.status_code
ouprint(response.status_code)
.J'avais le même problème avec les requêtes (la bibliothèque python). C'était justement l'en-
accept-encoding
tête.C'était réglé de cette façon:
'accept-encoding': 'gzip, deflate, br'
Je l'ai simplement supprimé de la demande et j'ai cessé de recevoir l'erreur.
la source
Pour moi, il n'utilisait pas d'authentification dans la demande.
la source
Pour moi, le serveur répondait par autre chose que 200 et la réponse n'était pas au format json. J'ai fini par le faire avant l'analyse json:
la source
J'ai rencontré le même problème, lors de l'impression de la chaîne json ouverte à partir d'un fichier json, j'ai trouvé que la chaîne json commençait par 'ï »¿', ce qui, en faisant une certaine recherche, est dû au fait que le fichier est par défaut décodé avec UTF-8, et en changeant l'encodage en utf-8-sig, la marque est supprimée et charge json sans problème:
la source
Si vous êtes un utilisateur Windows, l'API Tweepy peut générer une ligne vide entre les objets de données. En raison de cette situation, vous pouvez obtenir l'erreur "JSONDecodeError: valeur attendue: ligne 1 colonne 1 (caractère 0)". Pour éviter cette erreur, vous pouvez supprimer des lignes vides.
Par exemple:
Référence: L' API de flux Twitter donne JSONDecodeError ("Valeur attendue", s, valeur err.) de None
la source
Vérifiez simplement si la demande a un code d'état 200. Ainsi, par exemple:
la source
J'ai reçu une telle erreur dans la réponse d'une API Web basée sur Python
.text
, mais cela m'a conduit ici, donc cela peut aider les autres avec un problème similaire (il est très difficile de filtrer la réponse et de demander des problèmes dans une recherche lors de l'utilisation derequests
..)L'utilisation
json.dumps()
de l' argument de demandedata
pour créer une chaîne JSON correctement échappée avant le POSTing a résolu le problème pour moila source