Ошибка при разборе данных JSON - PullRequest
8 голосов
/ 03 августа 2011

Я хочу получить данные о высоте из Google Earth по широте и долготе, но я не могу это сделать.Я не уверен, что делаю не так, но мой код показан ниже.

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 ]

11 голосов
/ 15 мая 2012

Пост немного опоздал, но недавно столкнулся с той же проблемой. Решение ниже работает для меня. В основном то, что сказал Леннарт.

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))
6 голосов
/ 03 августа 2011

В Python 3 двоичные данные, такие как необработанный ответ http-запроса, хранятся в байтовых объектах. json / simplejson ожидает строки. Решение состоит в том, чтобы декодировать байтовые данные в строковые данные с соответствующей кодировкой, которую вы можете найти в заголовке.

Вы найдете кодировку с:

encoding = req.headers.get_content_charset()

Затем вы делаете содержимое строкой:

body = req.readall().decode(encoding)

Это тело, которое вы затем можете передать загрузчику json.

(Также, пожалуйста, перестаньте называть ответ «req». Это сбивает с толку, и звучит так, будто это запрос, а это не так.)

...