JSONDecodeError: Expecting value: line 1 column 1 (char 0)
Your code produced an empty response body, you'd want to check for that or catch the exception raised. It is possible the server responded with a 204 No Content response, or a non-200-range status code was returned (404 Not Found, etc.). Check for this.
Note:
There is no need to use
simplejson
library, the same library is included with Python as thejson
module.There is no need to decode a response from UTF8 to unicode, the
simplejson
/json
.loads()
method can handle UTF8 encoded data natively.pycurl
has a very archaic API. Unless you have a specific requirement for using it, there are better choices.
Either the requests
or httpx
offers much friendlier APIs, including JSON support. If you can, replace your call with:
import requestsresponse = requests.get(url)response.raise_for_status() # raises exception when not a 2xx responseif response.status_code != 204: return response.json()
Of course, this won't protect you from a URL that doesn't comply with HTTP standards; when using arbirary URLs where this is a possibility, check if the server intended to give you JSON by checking the Content-Type header, and for good measure catch the exception:
if ( response.status_code != 204 and response.headers["content-type"].strip().startswith("application/json")): try: return response.json() except ValueError: # decide how to handle a server that's misbehaving to this extent
Check the response data-body, whether actual data is present and a data-dump appears to be well-formatted.
In most cases your json.loads
- JSONDecodeError: Expecting value: line 1 column 1 (char 0)
error is due to :
- non-JSON conforming quoting
- XML/HTML output (that is, a string starting with <), or
- incompatible character encoding
Ultimately the error tells you that at the very first position the string already doesn't conform to JSON.
As such, if parsing fails despite having a data-body that looks JSON like at first glance, try replacing the quotes of the data-body:
import sys, jsonstruct = {}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()
Note: Quotes within the data must be properly escaped
Be sure to remember to invoke json.loads()
on the contents of the file, as opposed to the file path of that JSON:
json_file_path = "/path/to/example.json"with open(json_file_path, 'r') as j: contents = json.loads(j.read())
I think a lot of people are guilty of doing this every once in a while (myself included):
contents = json.loads(json_file_path)