JSONDecodeError: Expecting value: line 1 column 1 (char 0) JSONDecodeError: Expecting value: line 1 column 1 (char 0) python python

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.


  • There is no need to use simplejson library, the same library is included with Python as the json 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)