【问题标题】:JSON ValueError: Unterminated stringJSON ValueError:未终止的字符串
【发布时间】:2014-11-01 02:17:00
【问题描述】:

我的脚本可以运行,但有时会因该错误而崩溃:

Traceback (most recent call last):
  File "planetafm.py", line 6, in <module>
    songs = json.loads(json_data)
  File "/usr/lib/python2.7/json/__init__.py", line 338, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python2.7/json/decoder.py", line 382, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Unterminated string starting at: line 1 column 32 (char 31)

比如那个json导致:

rdsData({"now":{"id":"0052-55","title":"Summertime Sadness (Radio Mix)","artist":"Lana Del Rey","startDate":"2014-09-07 21:48:51","duration":"2014-09-07 21:48:51"}})

源代码:

import requests, json, re

url = "http://rds.eurozet.pl/reader/var/planeta.json"
response = requests.get(url)
json_data = re.match('rdsData\((.*?)\)', response.content).group(1)
songs = json.loads(json_data)
print (songs['now']['artist'] + " - " + songs['now']['title']).encode('utf-8')

为什么那个 json 是无效的?如何解决这个问题?
感谢您的回答!

【问题讨论】:

    标签: python json python-2.7 python-requests


    【解决方案1】:

    您的正则表达式在文本内出现右括号问题。您可以通过在正则表达式中添加 $ 来修复它:

    import requests, json, re
    
    url = "http://rds.eurozet.pl/reader/var/planeta.json"
    response = requests.get(url)
    print response.content
    json_data = re.match('rdsData\((.*?)\)$', response.content).group(1)
    print json_data
    songs = json.loads(json_data)
    print (songs['now']['artist'] + " - " + songs['now']['title']).encode('utf-8')
    

    【讨论】:

    • 就是这样 - 谢谢。
    【解决方案2】:

    您的提取方法有缺陷;您的表达式在第一个 ) 字符处终止:

    >>> import re
    >>> import requests
    >>> url = "http://rds.eurozet.pl/reader/var/planeta.json"
    >>> r = requests.get(url)
    >>> re.match('rdsData\((.*?)\)', r.content).group(1)
    '{"now":{"id":"0052-55","title":"Summertime Sadness (Radio Mix'
    

    与其使用正则表达式,不如使用str.partition()str.rpartition() 将值划分出来:

    url = "http://rds.eurozet.pl/reader/var/planeta.json"
    response = requests.get(url)
    json_data = response.content.partition('(')[-1].rpartition(')')[0]
    songs = json.loads(json_data)
    

    演示:

    >>> json_data = r.content.partition('(')[-1].rpartition(')')[0]
    >>> json.loads(json_data)['now']
    {u'duration': u'2014-09-07 21:48:51', u'startDate': u'2014-09-07 21:48:51', u'artist': u'Lana Del Rey', u'id': u'0052-55', u'title': u'Summertime Sadness (Radio Mix)'}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-16
      • 2014-06-09
      • 2014-06-14
      • 1970-01-01
      相关资源
      最近更新 更多