JSON wrapped in NULL?

Question:

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.

Asked By: Zsolt Balla

||

Answers:

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.

Answered By: MattDMo

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])
Answered By: tdelaney
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.