How do I fix a "JSONDecodeError: No JSON object could be decoded: line 1 column 0 (char 0)"?
Asked Answered
T

1

7

I'm trying to get Twitter API search results for a given hashtag using Python, but I'm having trouble with this "No JSON object could be decoded" error. I had to add the extra % towards the end of the URL to prevent a string formatting error. Could this JSON error be related to the extra %, or is it caused by something else? Any suggestions would be much appreciated.

A snippet:

import simplejson
import urllib2

def search_twitter(quoted_search_term): 
    url = "http://search.twitter.com/search.json?callback=twitterSearch&q=%%23%s" % quoted_search_term
    f = urllib2.urlopen(url)
    json = simplejson.load(f)
    return json
Terzetto answered 30/7, 2010 at 14:54 Comment(3)
What is the actual content of the response? Using your code, you can find that with something like content = f.read().Pteranodon
I used your code and tried printing content but got the same error: JSONDecodeError: No JSON object could be decoded: line 1 column 0 (char 0) function pull_tweets in twitter_puller_1.py at line 28 data1 = search_twitter(query1) function search_twitter in twitter_puller_1.py at line 14 json = simplejson.load(f) function load in untitled at line 328 None function loads in untitled at line 384 None function decode in untitled at line 402 obj, end = self.raw_decode(s, idx=_w(s, 0).end()) function raw_decode in untitled at line 420 raise JSONDecodeError("No JSON object could be decoded", s, idx)Terzetto
See blcArmadillo's answer. You need to remove the callback argument from your request to Twitter. Something like url = "http://search.twitter.com/search.json?q=%s" % quoted_search_term should work.Pteranodon
A
8

There were a couple problems with your initial code. First you never read in the content from twitter, just opened the url. Second in the url you set a callback (twitterSearch). What a call back does is wrap the returned json in a function call so in this case it would have been twitterSearch(). This is useful if you want a special function to handle the returned results.

import simplejson
import urllib2

def search_twitter(quoted_search_term): 
    url = "http://search.twitter.com/search.json?&q=%%23%s" % quoted_search_term
    f = urllib2.urlopen(url)
    content = f.read()
    json = simplejson.loads(content)
    return json
Ancon answered 30/7, 2010 at 15:56 Comment(2)
You're half right. The actual problem was the callback argument, which causes Twitter to return JSONP, which can't be parsed as JSON. But the code for reading the JSON was fine (it just passed the file-like object f` directly to the simplejson.load() function, which takes file-like objects).Pteranodon
Thank you so much for explaining this to me, blcArmadillo and Will McCutchen! It works now :)Terzetto

© 2022 - 2024 — McMap. All rights reserved.