解析JSON数据时出错

8 投票
2 回答
5558 浏览
提问于 2025-04-16 22:47

我想根据经纬度从谷歌地球获取海拔数据,但我不知道该怎么做。我的代码如下:

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))

撰写回答