skip to Main Content

I’m using the API of an affiliate network (Sovrn), expecting to retrieve a product’s specification using the URL.

As per their documentation, I use:

url = 'URL-goes-here'

headers = {
    "accept": "application/json",
    "authorization": "VERY-HARD-TO-GUESS"
}

response = requests.get(url, headers=headers)

The code is working, the response I get is 200, the header contains the magical content-type application/json line

when I do

print(response.text)

I get

NULL({"merchantName":"Overstock","canonicalUrl":"URL goes here","title":"product name",...});

I tested for response type of response.text, it’s <class 'str'> as expected. But when I try to process the response as json:

product_details = json.load(response.text)

I get an error message:

requests.exceptions.JSONDecodeError: [Errno Expecting value] 

I’m new to JSON, but I assume the error is due to the outer NULL that the (seemingly valid) data is wrapped in.

After spending a few hours searching for a solution, it seems that I must be missing something obvious, but not sure what.

Any pointers would be extremely helpful.

2

Answers


  1. You can ignore NULL( at the beginning and ); at the end by using string slicing:

    product_details = json.loads(response.text[5:-2])
    

    Additionally, you should be using json.loads() as the content is a string.

    Login or Signup to reply.
  2. That’s clearly a bug in the API. Assuming it will be fixed after you complain, you could add a hack to your code

    def sovrn_json_load_hack(json_text):
        """sovrn is returning invalid json as of (revision here)."""
        if not json_text.startswith ("NULL("):
            return json.loads(json_text)
        else:
            return json.loads(json_text[5:-2])
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search