Python 解析错误 JSON
Python error in parsing JSON
我正在开发一种机器学习算法来预测我所在城市的温度。我正在使用 wunderground API 来获取数据。因此,在这段代码中,我执行了对 API:
的请求
def extract_weather_data(url, api_key, target_date, days):
records = []
for _ in range(days):
request = BASE_URL.format(API_KEY, target_date.strftime('%Y%m%d'))
response = requests.get(request)
print request
if response.status_code == 200:
data = response.json()['history']['dailysummary'][0]
records.append(DailySummary(
date=target_date,
meantempm=data['meantempm'],
meandewptm=data['meandewptm'],
meanpressurem=data['meanpressurem'],
maxhumidity=data['maxhumidity'],
minhumidity=data['minhumidity'],
maxtempm=data['maxtempm'],
mintempm=data['mintempm'],
maxdewptm=data['maxdewptm'],
mindewptm=data['mindewptm'],
maxpressurem=data['maxpressurem'],
minpressurem=data['minpressurem'],
precipm=data['precipm']))
time.sleep(6)
target_date += timedelta(days=1)
return records
records = extract_weather_data(BASE_URL, API_KEY, target_date, 100)
我在 3-4 个请求后得到这个错误:
Traceback (most recent call last):
File "data.py", line 45, in <module>
records = extract_weather_data(BASE_URL, API_KEY, target_date, 100)
File "data.py", line 26, in extract_weather_data
data = response.json()['history']['dailysummary'][0]
File "/usr/local/lib/python2.7/dist-packages/requests/models.py", line 892, in json
return complexjson.loads(self.text, **kwargs)
File "/usr/lib/python2.7/json/__init__.py", line 339, in loads
return _default_decoder.decode(s)
File "/usr/lib/python2.7/json/decoder.py", line 364, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python2.7/json/decoder.py", line 380, in raw_decode
obj, end = self.scan_once(s, idx)
ValueError: Expecting property name enclosed in double quotes: line 11 column 1 (char 155)
我该如何解决这个问题?
非常感谢!
来自你错误的最后一部分:
ValueError: Expecting property name enclosed in double quotes: line 11 column 1 (char 155)
听起来您收到的数据格式不正确 - 不是 JSON,或者不完全是 Python 期望的格式。如果您只是打印 response.content
或通过 Postman 之类的方式获取数据,这可能会帮助您找出问题所在。
根据您收到的内容,您可以 "fix" 在将响应解析为 JSON 之前,或者您可能需要以不同的方式解析它。
关于 HTTP 请求(API 与否,无论预期响应的内容类型如何)的黄金法则是事情可能会以多种方式在任何时间出错,并且它们 总有一天会 以最意想不到的方式出错,所以如果您希望拥有一个像样的健壮的客户端程序,您必须准备好处理任何可能的结果。
大多数情况下,这实际上意味着在 try/except 处理程序中包装请求调用 plus 测试响应的状态代码、内容类型和有效内容(而不是盲目地假设你得到你要求的),并根据异常/意外响应值决定是否值得在放弃(某些错误情况可能是暂时的)之前重试几次请求(重试之间的延迟增加)或立即放弃.在所有情况下,您还希望确保让用户知道出了什么问题,并在您决定放弃时提供尽可能多的信息(请求、响应(如果有)、异常和完整的回溯)。
我正在开发一种机器学习算法来预测我所在城市的温度。我正在使用 wunderground API 来获取数据。因此,在这段代码中,我执行了对 API:
的请求def extract_weather_data(url, api_key, target_date, days):
records = []
for _ in range(days):
request = BASE_URL.format(API_KEY, target_date.strftime('%Y%m%d'))
response = requests.get(request)
print request
if response.status_code == 200:
data = response.json()['history']['dailysummary'][0]
records.append(DailySummary(
date=target_date,
meantempm=data['meantempm'],
meandewptm=data['meandewptm'],
meanpressurem=data['meanpressurem'],
maxhumidity=data['maxhumidity'],
minhumidity=data['minhumidity'],
maxtempm=data['maxtempm'],
mintempm=data['mintempm'],
maxdewptm=data['maxdewptm'],
mindewptm=data['mindewptm'],
maxpressurem=data['maxpressurem'],
minpressurem=data['minpressurem'],
precipm=data['precipm']))
time.sleep(6)
target_date += timedelta(days=1)
return records
records = extract_weather_data(BASE_URL, API_KEY, target_date, 100)
我在 3-4 个请求后得到这个错误:
Traceback (most recent call last):
File "data.py", line 45, in <module>
records = extract_weather_data(BASE_URL, API_KEY, target_date, 100)
File "data.py", line 26, in extract_weather_data
data = response.json()['history']['dailysummary'][0]
File "/usr/local/lib/python2.7/dist-packages/requests/models.py", line 892, in json
return complexjson.loads(self.text, **kwargs)
File "/usr/lib/python2.7/json/__init__.py", line 339, in loads
return _default_decoder.decode(s)
File "/usr/lib/python2.7/json/decoder.py", line 364, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python2.7/json/decoder.py", line 380, in raw_decode
obj, end = self.scan_once(s, idx)
ValueError: Expecting property name enclosed in double quotes: line 11 column 1 (char 155)
我该如何解决这个问题?
非常感谢!
来自你错误的最后一部分:
ValueError: Expecting property name enclosed in double quotes: line 11 column 1 (char 155)
听起来您收到的数据格式不正确 - 不是 JSON,或者不完全是 Python 期望的格式。如果您只是打印 response.content
或通过 Postman 之类的方式获取数据,这可能会帮助您找出问题所在。
根据您收到的内容,您可以 "fix" 在将响应解析为 JSON 之前,或者您可能需要以不同的方式解析它。
关于 HTTP 请求(API 与否,无论预期响应的内容类型如何)的黄金法则是事情可能会以多种方式在任何时间出错,并且它们 总有一天会 以最意想不到的方式出错,所以如果您希望拥有一个像样的健壮的客户端程序,您必须准备好处理任何可能的结果。
大多数情况下,这实际上意味着在 try/except 处理程序中包装请求调用 plus 测试响应的状态代码、内容类型和有效内容(而不是盲目地假设你得到你要求的),并根据异常/意外响应值决定是否值得在放弃(某些错误情况可能是暂时的)之前重试几次请求(重试之间的延迟增加)或立即放弃.在所有情况下,您还希望确保让用户知道出了什么问题,并在您决定放弃时提供尽可能多的信息(请求、响应(如果有)、异常和完整的回溯)。