获取JSON错误:JSON对象必须是str,而不是'bytes'

时间:2017-11-01 17:35:45

标签: json

尝试将脚本从Python 2翻译为3,以便使脚本从narodmon.ru获取wheater指示到Domiticz /

#!/usr/bin/env python3.5
# -*- coding: utf-8 -*-
import urllib.request, urllib.error, urllib.parse
import json
import hashlib
import uuid

api_key = '********'
app_id = str(uuid.getnode())
md5_app_id = hashlib.md5(app_id.encode('utf-8')).hexdigest()
data = {
    'cmd': 'sensorsNearby',
    'uuid': md5_app_id,
    'api_key': api_key,
    'radius': 11,
    'lat': 55.75,
    'lng': 37.62,
    'lang': 'ru'
    }

try:
    request = urllib.request.Request('http://narodmon.ru/api',json.dumps(data).encode("utf-8"))
    response = urllib.request.urlopen(request)
    result = json.loads(response.read())
    print((json.dumps(result, indent=4, sort_keys=True)))
except urllib.error.URLError as e:
    print('HTTP error:', e)
except (ValueError, TypeError) as e:
    print('JSON error:', e)

然后出错

JSON error: the JSON object must be str, not 'bytes'

我哪里错了? Thanx很多

1 个答案:

答案 0 :(得分:4)

response.read()返回一个bytes对象,它就是:一个字节序列。您需要先解码它,因为Python不知道字节代表什么。

buf = response.read()
result = json.loads(buf.decode('utf-8'))

除非您处理大量非ASCII字符,否则很容易将Unicode字符串与其UTF-8编码混淆。

>>> 'foo'
'foo'
>>> 'foo'.encode('utf-8')
b'foo'
>>> 'föö'
'föö'
>>> 'föö'.encode('utf-8')
b'f\xc3\xb6\xc3\xb6'