解析JSON数据时出错
我想根据经纬度从谷歌地球获取海拔数据,但我不知道该怎么做。我的代码如下:
def getElevation(locations,sensor="true", **elvtn_args):
elvtn_args.update({
'locations': locations,
'sensor': sensor
})
url = ELEVATION_BASE_URL
params = urllib.parse.urlencode(elvtn_args)
baseurl = url +"?"+ params;
req = urllib.request.urlopen(str(baseurl));
response = simplejson.load(req);
我遇到的错误是:
Traceback (most recent call last):
File "D:\GIS\Arctools\ElevationChart - Copy.py", line 85, in <module>
getElevation(pathStr)
File "D:\GIS\Arctools\ElevationChart - Copy.py", line 45, in getElevation
response = simplejson.load(req);
File "C:\Python32\lib\json\__init__.py", line 262, in load
parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
File "C:\Python32\lib\json\__init__.py", line 307, in loads
return _default_decoder.decode(s)
File "C:\Python32\lib\json\decoder.py", line 351, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
TypeError: can't use a string pattern on a bytes-like object
希望能得到一些帮助。
2 个回答
6
在Python 3中,像HTTP请求的原始响应这样的二进制数据是以字节对象的形式存储的。而json/simplejson需要的是字符串。解决这个问题的方法是把字节数据用合适的编码转换成字符串,这个编码可以在响应的头部找到。
你可以通过以下方式找到编码:
encoding = req.headers.get_content_charset()
然后你可以通过以下方式把内容转换成字符串:
body = req.readall().decode(encoding)
这个转换后的内容就可以传给json加载器使用了。
(另外,请不要再把响应称为“req”。这样会让人困惑,听起来像是请求,而实际上并不是。)
11
这篇帖子发得有点晚,但我最近也遇到了同样的问题。下面的解决办法对我有效。基本上就是Lennart说的那个意思。
from urllib import request
import json
req = request.urlopen('https://someurl.net/api')
encoding = req.headers.get_content_charset()
obj = json.loads(req.read().decode(encoding))