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

If you are working with APIs and trying to fetch and parse the JSON data while making the HTTP or curl requests and JSON response is not well-formed, Python will throw json.decoder.jsondecodeerror: expecting value: line 1 column 1 (char 0).

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

Let us take a look at the possible causes of JSONDecodeError and how we solve this issue in our code with some examples.

In most of cases, you get json.loads- JSONDecodeError: Expecting value: line 1 column 1 (char 0) error is due to :

  1. The response might be in some other format such as XML, HTML, etc.
  2. The JSON response is not structured properly.
  3. The response type doesn’t come in the format of application/json. Rather it comes in string format, which in turn throws a JSONDecodeError while parsing the response.
  4. Empty response 
  5. Invalid status code or httpx error

Also, read the Python JSONPath tutorial

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

Let me demonstrate with a simple example of replicating a JSONDecodeError, and we will look at solving the same. 

In this example, we are trying to load a JSON file from the specified path and print the contents of the JSON file. However, since the JSON file is empty, the JSON module will throw a JSONDecodeError when we try to read the empty content. It always expects the proper JSON structure.

import json

file_path = "C:/Projects/Tryouts/books.json"

with open(file_path, 'r') as j:
     contents = json.loads(j.read())
     print(contents)

Output

Traceback (most recent call last):
  File "c:/Projects/Tryouts/main.py", line 6, in <module>
    contents = json.loads(j.read())
  File "C:\Users\abc\AppData\Local\Programs\Python\Python37\lib\json\__init__.py", line 348, in loads    
    return _default_decoder.decode(s)
  File "C:\Users\abc\AppData\Local\Programs\Python\Python37\lib\json\decoder.py", line 337, in decode    
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Users\abc\AppData\Local\Programs\Python\Python37\lib\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)

The json.loads(j.read()) tries to load the JSON content and parse the JSON, and during that time, if it’s not well structured, you get a JSONDecodeError.

Note: In this case, if the JSON file is not found, you will get a FileNotFoundError: [Errno 2] No such file or directory

Solution 

The solution is simple and straightforward. Validate if the file is not empty and has proper JSON content. Now that we have added the proper content to the books.json file when we run the same code again, we get the below output.

# Python program to solve JSONDecodeError: Expecting value: line 1 column 1 (char 0)
import json

file_path = "C:/Projects/Tryouts/books.json"

with open(file_path, 'r') as j:
     contents = json.loads(j.read())
     print(contents)

Output

{'category': 'reference', 'author': 'Nigel Rees', 'title': 'Sayings of the Century', 'isbn': '6-246-2356-8', 'price': 8.95}

Other Possible Solutions

Ensure HTTP 200 status code and valid content type as application/json

If you are making requests to API, make sure to check the response status code is 200 (OK) and then perform JSON parse. Below is the sample snippet on how you can ensure to check the response has 200 status code and valid content type as application/json

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

Invoke json.load() on the contents of the file

If you are calling and loading json files directly, ensure that you are not passing a file path directly to the json.load() method instead pass the contents into the json.load() method.

Bad Practice

json_file_path = "/path/to/example.json"

contents = json.loads(json_file_path)

Good Practice

json_file_path = "/path/to/example.json"

with open(json_file_path, 'r') as j:
     contents = json.loads(j.read())
Leave a Reply

Your email address will not be published. Required fields are marked *

Sign Up for Our Newsletters

Get notified of the best deals on our WordPress themes.

You May Also Like
List of Python free ebooks

List of Free Python Books

Table of Contents Hide Python SuccinctlyPython Data Science HandbookThink Python 2nd EditionAutomate the Boring Stuff with PythonMaking Games with Python & PygameData Structures and Algorithms in Python Google Python Style GuideA…
View Post