Python 3.4.3 json.dumps() "is not JSON serializable"从字节转换时出错

标签 python json django serialization urllib2

所以我遇到了这个问题,我使用 urllib 从服务器获取 JSON 响应,但是当我尝试将返回的 b'' 对象转换为 JSON 时,出现错误说 “...不是 JSON 可序列化”

这是我使用 urllib2 发出 GET 请求的 Python 代码:

    from urllib.request import Request, urlopen
    from urllib.error import HTTPError
    import json


    hdr = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
           'Accept': 'application/json',
           'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
           'Accept-Encoding': 'none',
           'Accept-Language': 'en-US,en;q=0.8',
           'Connection': 'keep-alive'}

    file = Request('http://blahblahblah.com', headers=hdr)

    try:
        page = urlopen(file)
    except HTTPError as e:
        print(e)
        print('')
        return

    content = page.read()
    page.close()


    print(page.info().get_content_charset())  # Returns 'utf-8'
    print(content)
    # print(json.dumps(content))  # Causes 'Not Serializable' Error
    # print(content.decode('utf-8')  # Causes 'UnicodeEncodeError' Error

这是我从服务器得到的响应:

b'{"game":{"id":1,"name":"Thief II: The Metal Age","slug":"thief-ii-the-metal-age","release_date":"2000-03-21","created_at":"2011-02-13 00:20:38 +0000","updated_at":"2016-03-15 19:41:25 +0000","alternative_names":[{"name":"Thief II: \xd0\xad\xd0\xbf\xd0\xbe\xd1\x85\xd0\xb0 \xd0\xbc\xd0\xb5\xd1\x82\xd0\xb0\xd0\xbb\xd0\xbb\xd0\xb0","comment":"Russian title"},{"name":"Dark Project II: The Metal Age","comment":"German title"},{"name":"Dark Project II: L\'Age de M\xc3\xa9tal","comment":"French title"}],"genres":[{"name":"Shooter"}],"themes":[{"name":"Action"},{"name":"Fantasy"},{"name":"Stealth"}],"rating":9.131189346313477,"release_dates":[{"platform_name":"Microsoft Windows","release_date":"2000-03-21"}],"companies":[{"id":4,"developer":false,"publisher":true,"name":"Eidos Interactive"},{"id":3,"developer":true,"publisher":false,"name":"Looking Glass Studios"},{"id":26,"developer":false,"publisher":true,"name":"Square Enix"}],"cover":{"url":"//res.cloudinary.com/igdb/image/upload/t_cover_small/qagoforxr6tofvpmgy9g.png","width":612,"height":650,"id":"qagoforxr6tofvpmgy9g"},"screenshots":[{"url":"//res.cloudinary.com/igdb/image/upload/t_screenshot_med/z0b9mqcqbtmnnxigekjc.jpg","title":"Microsoft Windows Title Screen","width":640,"height":480,"id":"z0b9mqcqbtmnnxigekjc"},{"url":"//res.cloudinary.com/igdb/image/upload/t_screenshot_med/puvydf5d6v0zirxfhzpg.jpg","title":"Microsoft Windows Ingame Screen","width":640,"height":480,"id":"puvydf5d6v0zirxfhzpg"}],"videos":[{"title":"Trailer","uid":"9C543B6uJ88"}]}}'

我在其他地方读到,我必须首先将响应转换为 str 或使用 utf-8 编码,但是当我尝试替换 print( content)print(content.decode('utf-8') ,我收到以下错误:

UnicodeEncodeError: 'charmap' codec can't encode characters in position 231-235: character maps to <undefined>

最佳答案

服务器返回字节(我记得是Python 2中的字符串),我可以看到它是utf-8,所以你需要将它解码为unicode

例如,这有效:

print(json.loads(content.decode()))

这里是一个链接,您可以在其中找到一些相关信息: https://docs.python.org/3.4/howto/unicode.html

您可能需要使用严格模式,请查看操作方法

关于Python 3.4.3 json.dumps() "is not JSON serializable"从字节转换时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36507281/

相关文章:

python - 静态文件的 Tornado 自定义错误处理程序

python - 将 Django 与 SSL 结合使用以集成 PayPal

python - 在 Django 1.11 中将 QuerySet 传递给 Celery 任务

python - 为什么我在使用 Google App Engine 教程时遇到服务器错误?

python - 内存错误: Unable to allocate array shape ({very large}), windows Python解决方案

php - Volley 登录错误:Null

ios - 使用结构根据第一个选择器 View 过滤第二个和第三个选择器 View

javascript - $.getJSON() + $.each() 导致某些对象的键名称未定义

python - django unicode 到字符串

python easy_install 因所有包的 SSL 证书错误而失败