【问题标题】:requests.json and json.loads() JSONDecodeError: Expecting value: line 1 column 1 (char 0)requests.json 和 json.loads() JSONDecodeError:预期值:第 1 行第 1 列(字符 0)
【发布时间】:2018-07-03 21:17:32
【问题描述】:

我正在尝试转换我在 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)

【问题讨论】:

  • 那不是 JSON。它看起来像 JSONP。
  • 还是不行
  • 这是您在尝试加载空字符串时遇到的错误。您是否验证了响应正文不为空?

标签: python json


【解决方案1】:

此网址返回的不是 JSON,而是 JSONP。为了解析响应,您可以从 url 中删除最后一个参数 (json.wrf=jsonp1530647389471) - 然后响应将变为 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()

【讨论】:

  • 请求库的 get 函数有一个 .json() 函数。所以你可以改用它。所以不是你的第二行:print(response.json())
【解决方案2】:

如果您必须使用相同的 URL 而不修改它,您可以使用 re 模块在请求的响应内容中提取 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)

否则,另一个答案是正确的,使用起来更简单。

【讨论】:

  • 谢谢。但不要忘记@VictorRodrigues 接受最适合您需求的答案。
  • @ChihebNexus 我在 SO 上看到这个的频率很奇怪。维克多……你在哪里?!你需要接受一个答案;)
【解决方案3】:

我收到解码错误,因为我在循环中读取数据并且连接超时或在几次“获取”后结束我尝试睡眠几毫秒以克服此错误

    url = "https://api.coindcx.com/exchange/ticker"    
    while(True):
        t.sleep(0.5)
        resp = requests.get(url) 
        resp_parsed = re.sub(r'^jsonp\d+(|)\s+$', '', resp.text)    
        data = json.loads(resp_parsed)
        print(pd.DataFrame(data).query("market=='LINKINR'")['last_price'].values[0])

【讨论】:

    猜你喜欢
    • 2019-05-02
    • 2021-09-30
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多