request.json и json.loads () JSONDecodeError: Ожидаемое значение: строка 1, столбец 1 (символ 0)

1

Я пытаюсь преобразовать ответ, который у меня есть в json

response = requests.get('http://solr.library.ucla.edu/solr/sheetmusic/select/?q=%5C*%20AND%20(url_keyword:http*)&version=2.2&start=0&rows=100&indent=on&facet=true&facet.field=r_date_facetRange&wt=json&json.wrf=jsonp1530647389471')
response = json.loads(response.content.decode('utf-8'))

Но я верну эту ошибку

~/.virtualenvs/pistache/lib/python3.6/site-packages/requests/models.py in json(self, **kwargs)
        890                     # used.
        891                     pass
    --> 892         return complexjson.loads(self.text, **kwargs)
        893 
        894     @property

    /usr/lib/python3.6/json/__init__.py in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
        352             parse_int is None and parse_float is None and
        353             parse_constant is None and object_pairs_hook is None and not kw):
    --> 354         return _default_decoder.decode(s)
        355     if cls is None:
        356         cls = JSONDecoder

    /usr/lib/python3.6/json/decoder.py in decode(self, s, _w)
        337 
        338         """
    --> 339         obj, end = self.raw_decode(s, idx=_w(s, 0).end())
        340         end = _w(s, end).end()
        341         if end != len(s):

    /usr/lib/python3.6/json/decoder.py in raw_decode(self, s, idx)
        355             obj, end = self.scan_once(s, idx)
        356         except StopIteration as err:
    --> 357             raise JSONDecodeError("Expecting value", s, err.value) from None
        358         return obj, end

    JSONDecodeError: Expecting value: line 1 column 1 (char 0)
  • 1
    Это не JSON. Похоже на JSONP.
  • 0
    Все еще не работает
Показать ещё 1 комментарий
Теги:

2 ответа

0
Лучший ответ

Если вы должны использовать один и тот же URL-адрес без его модификации, вы можете использовать re module для извлечения JSON в ответе на контент вашего запроса, как в этом примере:

import re, json, requests

url = 'http://solr.library.ucla.edu/solr/sheetmusic/select/?q=%5C*%20AND%20(url_keyword:http*)&version=2.2&start=0&rows=100&indent=on&facet=true&facet.field=r_date_facetRange&wt=json&json.wrf=jsonp1530647389471'

resp = requests.get(url)
resp_parsed = re.sub(r'^jsonp\d+\(|\)\s+$', '', resp.text)
data = json.loads(resp_parsed)
print(data)

В противном случае другой ответ правильный и более простой в использовании.

  • 1
    Работал !!!!! Спасибо
  • 0
    Благодарю. Но не забудьте @VictorRodrigues, чтобы принять ответ, который больше всего соответствует вашим потребностям.
Показать ещё 1 комментарий
3

Этот url возвращает не JSON, а JSONP. Чтобы разобрать ответ, вы можете удалить последний параметр (json.wrf=jsonp1530647389471) из url - тогда ответ станет JSON, и вы сможете проанализировать его с помощью json.loads.

response = requests.get('http://solr.library.ucla.edu/solr/sheetmusic/select/?q=%5C*%20AND%20(url_keyword:http*)&version=2.2&start=0&rows=100&indent=on&facet=true&facet.field=r_date_facetRange&wt=json')
print json.loads(response.content.decode('utf-8'))
# {u'facet_counts': {u'facet_ranges': {}...

Или, чтобы сделать его более простым:

response = requests.get('http://solr.library.ucla.edu/solr/sheetmusic/select/?q=%5C*%20AND%20(url_keyword:http*)&version=2.2&start=0&rows=100&indent=on&facet=true&facet.field=r_date_facetRange&wt=json').json()
  • 2
    Функция get библиотеки запросов имеет функцию .json() . Таким образом, вы можете использовать это вместо этого. Поэтому вместо вашей второй строки: print(response.json())

Ещё вопросы

Сообщество Overcoder
Наверх
Меню