【问题标题】:Python3 strange error with json.loads [duplicate]json.loads的Python3奇怪错误[重复]
【发布时间】:2016-05-03 16:38:14
【问题描述】:

我在使用服务 api 生成 JSON 响应的 Web 应用程序中使用 。该函数的以下部分工作正常并返回 JSON 文本输出:

def get_weather(query = 'london'):
    api_url = "http://api.openweathermap.org/data/2.5/weather?q={}&units=metric&appid=XXXXX****2a6eaf86760c"
    query = urllib.request.quote(query)
    url = api_url.format(query)
    response = urllib.request.urlopen(url)
    data = response.read()    
    return data

返回的输出是:

{"coord":{"lon":-0.13,"lat":51.51},"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04d"}],"base":"cmc stations","main":{"temp":12.95,"pressure":1030,"humidity":68,"temp_min":12.95,"temp_max":12.95,"sea_level":1039.93,"grnd_level":1030},"wind":{"speed":5.11,"deg":279.006},"clouds":{"all":76},"dt":1462290955,"sys":{"message":0.0048,"country":"GB","sunrise":1462249610,"sunset":1462303729},"id":2643743,"name":"London","cod":200}

这意味着data 是一个字符串,不是吗?

然而,注释return data,然后添加以下两行:

jsonData = json.loads(data)
return jsonData

产生以下错误:

TypeError:JSON 对象必须是 str,而不是 'bytes'

怎么了? dataJSON 对象,之前以字符串形式返回!我需要知道错误在哪里?

【问题讨论】:

    标签: flask python json python-3.x flask


    【解决方案1】:

    request 库返回的数据是二进制字符串,而 json.loads 接受 strings,因此您需要使用请求返回的编码将数据 (decode) 转换为字符串(通常是可以假设它是UTF-8)。

    您应该能够将您的代码更改为:

    return json.loads(data.decode("utf-8"))
    

    PS:在返回之前存储变量是多余的,所以我简化了一些事情

    【讨论】:

    • 它会产生这个错误:TypeError: 'dict' object is not callable
    • 嗯...让我试试代码
    • 所以测试这似乎在基本解释器中工作,所以你应该在运行我在这里添加的行后返回一个dict。如果调用者只期望str 而不是dict,请将其更改为return data.decode("utf-8"),但您可能会遇到一些更大的问题,因为错误表明您正在尝试调用返回的数据(即get_weather_result()
    • 您看到的类型错误并没有发生在json.loads,而是发生在您之后将数据转换为字典的某件事上。之后你在做什么?快速测试:>>> def retjson():... name = b'{"id": 20}'... return json.loads(name.decode('utf-8'))... >>> print(retjson()){'id': 20}
    • 之后就什么都没有了!这只是return! @monchitos82
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 2017-02-11
    • 2011-09-13
    相关资源
    最近更新 更多