Andrew Quoc-Anh Ho
Andrew Quoc-Anh Ho

Reputation: 131

Why is it giving me the error, "the JSON object must be str, not 'bytes'", and how do I fix it?

I was following a tutorial about how to use JSON objects (link: https://www.youtube.com/watch?v=Y5dU2aGHTZg). When they ran the code, they got no errors, but I did. Is it something to do with different Python versions or something?

from urllib.request import urlopen
import json

def printResults(data):
    theJSON = json.loads(data)
    print (theJSON)

def main():
    urlData ="http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_day.geojson"

    webUrl = urlopen(urlData)
    print(webUrl.getcode())
    if (webUrl.getcode()==200):
        data = webUrl.read()
        printResults(data)
    else:
        print ("You failed")

main()

Upvotes: 0

Views: 2892

Answers (2)

Ricardo Oyarzun
Ricardo Oyarzun

Reputation: 71

I think they were using a different version of the urllib

Try with urllib3 and do the import like this:

from urllib import urlopen

Hope this is the fix to your problem

Upvotes: 0

ShadowRanger
ShadowRanger

Reputation: 155323

The HTTPResponse object returned from urlopen reads bytes data (raw binary data), not str data (textual data), while the json module works with str. You need to know (or inspect the headers to determine) the encoding used for the data received, and decode it appropriately before using json.loads.

Assuming it's UTF-8 (most websites are), you can just change:

data = webUrl.read()

to:

data = webUrl.read().decode('utf-8')

and it should fix your problem.

Upvotes: 5

Related Questions