JSONDecodeError: Verwachte waarde: regel 1 kolom 1 (char 0)

Ik krijg de fout Expecting value: line 1 column 1 (char 0) wanneer ik JSON probeer te decoderen.

De URL die ik gebruik voor de API-aanroep werkt prima in de browser, maar geeft deze foutmelding als ik dit doe via een curl-verzoek. Het volgende is de code die ik gebruik voor het krulverzoek.

De fout treedt op bij 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:

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)

Antwoord 1, autoriteit 100%

Om het gesprek samen te vatten in de opmerkingen:

  • Het is niet nodig om de simplejson-bibliotheek te gebruiken, dezelfde bibliotheek wordt meegeleverd met Python als de json-module.

  • Het is niet nodig om een ​​antwoord van UTF8 naar unicode te decoderen, de simplejson / json .loads() methode kan native UTF8-gecodeerde gegevens verwerken.

  • pycurl heeft een zeer archaïsche API. Tenzij je een specifieke vereiste hebt om het te gebruiken, zijn er betere keuzes.

requests biedt de meest gebruiksvriendelijke API, inclusief JSON-ondersteuning. Vervang indien mogelijk uw oproep door:

import requests
return requests.get(url).json()

Antwoord 2, autoriteit 49%

Controleer de responsdata-body, of er daadwerkelijke data aanwezig is en of een data-dump goed opgemaakt lijkt te zijn.

In de meeste gevallen is uw json.loadsJSONDecodeError: Expecting value: line 1 column 1 (char 0) fout te wijten aan:

  • niet-JSON-conforme citaten
  • XML/HTML-uitvoer (dat wil zeggen een tekenreeks die begint met <), of
  • incompatibele tekencodering

Uiteindelijk vertelt de fout je dat op de allereerste positie de string al niet voldoet aan JSON.

Als het parseren mislukt ondanks dat het een data-body heeft die er op het eerste gezicht JSON-achtig uitziet, probeer dan de aanhalingstekens van de data-body te vervangen:

import sys, json
struct = {}
try:
  try: #try parsing to dict
    dataform = str(response_json).strip("'<>() ").replace('\'', '\"')
    struct = json.loads(dataform)
  except:
    print repr(resonse_json)
    print sys.exc_info()

Opmerking: aanhalingstekens in de gegevens moeten correct worden ontsnapt


Antwoord 3, autoriteit 46%

Vergeet niet om json.loads() aan te roepen op de inhoud van het bestand, in plaats van het bestandspad van dat bestand JSON:

json_file_path = "/path/to/example.json"
with open(json_file_path, 'r') as j:
     contents = json.loads(j.read())

Ik denk dat veel mensen zich hier zo nu en dan schuldig aan maken (waaronder ikzelf):

contents = json.loads(json_file_path)

Antwoord 4, autoriteit 27%

Met de requests lib JSONDecodeError kan gebeuren wanneer je een http-foutcode zoals 404 hebt en het antwoord probeert te ontleden als JSON !

Je moet eerst controleren op 200 (OK) of laten verhogen bij een fout om dit geval te voorkomen.
Ik wou dat het mislukte met een minder cryptische foutmelding.

OPMERKING: zoals Martijn Pieters vermeldde in de opmerkingen, kunnen servers kunnen reageren met JSON in geval van fouten (dit hangt af van de implementatie), dus controleer de Content-Type koptekst is betrouwbaarder.


Antwoord 5, autoriteit 15%

Controleer de coderingsindeling van uw bestand en gebruik de bijbehorende coderingsindeling tijdens het lezen van het bestand. Het zal je probleem oplossen.

with open("AB.json", encoding='utf-8', errors='ignore') as json_data:
     data = json.load(json_data, strict=False)

Antwoord 6, autoriteit 10%

Ik had hetzelfde probleem toen ik json-bestanden probeerde te lezen met

json.loads("file.json")

Ik heb het probleem opgelost met

with open("file.json", "r") as read_file:
   data = json.load(read_file)

misschien kan dit in jouw geval helpen


Antwoord 7, autoriteit 9%

Vaak is dit omdat de tekenreeks die u probeert te ontleden leeg is:

>>> import json
>>> x = json.loads("")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/__init__.py", line 348, in loads
    return _default_decoder.decode(s)
  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

U kunt dit verhelpen door vooraf te controleren of json_string leeg is:

import json
if json_string:
    x = json.loads(json_string)
else:
    # Your code/logic here 
    x = {}

Antwoord 8, autoriteit 6%

Ik ondervond hetzelfde probleem, terwijl ik de json-tekenreeks afdrukte die werd geopend vanuit een json-bestand, ontdekte dat de json-reeks begint met ‘i ?’, wat door enig onderzoek te wijten is aan het feit dat het bestand standaard gedecodeerd is met UTF- 8, en door de codering te wijzigen in utf-8-sig, wordt de markering verwijderd en laadt json geen probleem:

open('test.json', encoding='utf-8-sig')

Antwoord 9, autoriteit 3%

Ik kreeg deze foutmelding omdat mijn json-bestand leeg was.


Antwoord 10, autoriteit 2%

Er kunnen ingesloten nullen zijn, zelfs na het aanroepen van decode(). Gebruik vervangen():

import json
struct = {}
try:
    response_json = response_json.decode('utf-8').replace('\0', '')
    struct = json.loads(response_json)
except:
    print('bad json: ', response_json)
return struct

Antwoord 11, autoriteit 2%

Ik had hetzelfde probleem, in mijn geval heb ik het als volgt opgelost:

import json
with open("migrate.json", "rb") as read_file:
   data = json.load(read_file)

Antwoord 12, autoriteit 2%

Ik had precies dit probleem bij het gebruik van verzoeken.
Met dank aan Christophe Roussy voor zijn uitleg.

Om fouten op te sporen, gebruikte ik:

response = requests.get(url)
logger.info(type(response))

Ik kreeg een 404-reactie terug van de API.


Antwoord 13, autoriteit 2%

Controleer of het verzoek een statuscode 200 heeft. Dus bijvoorbeeld:

if status != 200:
    print("An error has occured. [Status code", status, "]")
else:
    data = response.json() #Only convert to Json when status is OK.
    if not data["elements"]:
        print("Empty JSON")
    else:
        "You can extract data here"

Antwoord 14

Ik had hetzelfde probleem met verzoeken (de python-bibliotheek). Het was toevallig de accept-encoding header.

Het was zo ingesteld: 'accept-encoding': 'gzip, deflate, br'

Ik heb het gewoon uit het verzoek verwijderd en kreeg de foutmelding niet meer.


Antwoord 15

Voor mij gebruikte het geen authenticatie in het verzoek.


Antwoord 16

Voor mij was het de server die reageerde met iets anders dan 200 en het antwoord was niet json-geformatteerd. Ik deed dit uiteindelijk vóór de json-parsering:

# this is the https request for data in json format
response_json = requests.get() 
# only proceed if I have a 200 response which is saved in status_code
if (response_json.status_code == 200):  
     response = response_json.json() #converting from json to dictionary using json library

Antwoord 17

Ik heb een dergelijke fout ontvangen in het antwoord van een op Python gebaseerde web-API .text, maar het heeft me hierheen geleid, dus dit kan anderen met een soortgelijk probleem helpen (het is erg moeilijk om reacties en verzoeken te filteren problemen in een zoekopdracht bij het gebruik van requests..)

Het gebruik van json.dumps() op de request data arg om een ​​correct-escaped string van JSON te maken voordat POSTing het probleem voor ik

requests.post(url, data=json.dumps(data))

Antwoord 18

Als u een Windows-gebruiker bent, kan Tweepy API een lege regel tussen gegevensobjecten genereren. Vanwege deze situatie kunt u de fout “JSONDecodeError: Expecting value: line 1 column 1 (char 0)” krijgen. Om deze fout te voorkomen, kunt u lege regels verwijderen.

Bijvoorbeeld:

 def on_data(self, data):
        try:
            with open('sentiment.json', 'a', newline='\n') as f:
                f.write(data)
                return True
        except BaseException as e:
            print("Error on_data: %s" % str(e))
        return True

Referentie:
Twitter stream API geeft JSONDecodeError("Waarde verwachten&quot ;, s, err.value) van Geen


Antwoord 19

In mijn geval is dat omdat de server af en toe een http-fout geeft. Dus af en toe krijgt mijn script het antwoord zoals dit, eerder dan het verwachte antwoord:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head><title>502 Bad Gateway</title></head>
<body bgcolor="white">
<h1>502 Bad Gateway</h1>
<p>The proxy server received an invalid response from an upstream server.<hr/>Powered by Tengine</body>
</html>

Dit is duidelijk niet in json-indeling en proberen .json() aan te roepen levert JSONDecodeError: Expecting value: line 1 column 1 (char 0)

U kunt het exacte antwoord dat deze fout veroorzaakt, afdrukken om beter te debuggen.
Als u bijvoorbeeld requests gebruikt en dan gewoon het veld .text afdrukt (voordat u .json() aanroept), is dit voldoende.


Antwoord 20

Dat deed ik:

  1. Open test.txt bestand, schrijf data
  2. Open test.txt bestand, lees gegevens

Dus ik heb het bestand niet gesloten na 1.

Ik heb toegevoegd

outfile.close()

en nu werkt het

LEAVE A REPLY

Please enter your comment!
Please enter your name here

five − 2 =

Other episodes