json 字符串中的逗号导致 json.loads 失败 "Unterminated string starting at:"
Comma in json string causes json.loads to fail with "Unterminated string starting at:"
这是我的测试命令:
curl -v -A 'TEST/1.0' -X POST -d 'events=[{"event":"reset", "test":"reset;123"}]' 'http://127.0.0.1:8080/_api'
这是我的 RequestHandler
class MyWebhookHandler(webapp2.RequestHandler):
def post(self):
events_json = self.request.get('events')
event_datum = json.loads(events_json) # exception here
每当我到达 json.loads
行时,我得到这个异常:
event_datum = json.loads(events_json)
File "/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 338, in loads
return _default_decoder.decode(s)
File "/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 366, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/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 27 (char 26)
我能做些什么来阻止这个异常?
编辑
问题可能与 self.request.get('events')
有关,而不是与 json 库有关。函数调用 returns
[{"event":"reset", "test":"reset
而不是
[{"event":"reset", "test":"reset;123"}]
您在请求中发送的是列表,而不是字符串 events=[{"event":"reset", "test":"reset;123"}]
您应该使用
'{"events":[{"event":"reset", "test":"reset;123"}]}'
其他用户没有提供正确答案。问题不在于您需要使用不同的 python 函数来获取 POST 请求参数 - get
是此处使用的正确函数以获取请求字符串 - 问题是您没有发送有效的 JSON 对象。您正在发送 javascript 表达式,该表达式将 JSON 对象分配给变量 events
。 JSON 是 javascript 表达式的 子集 ,但不是一回事。
相反,您应该使用:
curl -v -A 'TEST/1.0' -X POST -d '[{"event":"reset", "test":"reset;123"}]' 'http://127.0.0.1:8080/_api'
或
curl -v -A 'TEST/1.0' -X POST -d '{"events":[{"event":"reset", "test":"reset;123"}]}' 'http://127.0.0.1:8080/_api'
';'在 post 中,数据被认为是一个分隔符,与“&”通常的方式相同,因此 'events' 的值在该点结束,[=11 将出现一个空值=].
您应该在卷曲行中对字符串进行编码:
'events=[{"event":"reset", "test":"reset%38123"}]'
如果您通过 jQuery 和 $.post 执行 post,此编码将自动发生。
这是我的测试命令:
curl -v -A 'TEST/1.0' -X POST -d 'events=[{"event":"reset", "test":"reset;123"}]' 'http://127.0.0.1:8080/_api'
这是我的 RequestHandler
class MyWebhookHandler(webapp2.RequestHandler):
def post(self):
events_json = self.request.get('events')
event_datum = json.loads(events_json) # exception here
每当我到达 json.loads
行时,我得到这个异常:
event_datum = json.loads(events_json)
File "/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 338, in loads
return _default_decoder.decode(s)
File "/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 366, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/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 27 (char 26)
我能做些什么来阻止这个异常?
编辑
问题可能与 self.request.get('events')
有关,而不是与 json 库有关。函数调用 returns
[{"event":"reset", "test":"reset
而不是
[{"event":"reset", "test":"reset;123"}]
您在请求中发送的是列表,而不是字符串 events=[{"event":"reset", "test":"reset;123"}]
您应该使用
'{"events":[{"event":"reset", "test":"reset;123"}]}'
其他用户没有提供正确答案。问题不在于您需要使用不同的 python 函数来获取 POST 请求参数 - get
是此处使用的正确函数以获取请求字符串 - 问题是您没有发送有效的 JSON 对象。您正在发送 javascript 表达式,该表达式将 JSON 对象分配给变量 events
。 JSON 是 javascript 表达式的 子集 ,但不是一回事。
相反,您应该使用:
curl -v -A 'TEST/1.0' -X POST -d '[{"event":"reset", "test":"reset;123"}]' 'http://127.0.0.1:8080/_api'
或
curl -v -A 'TEST/1.0' -X POST -d '{"events":[{"event":"reset", "test":"reset;123"}]}' 'http://127.0.0.1:8080/_api'
';'在 post 中,数据被认为是一个分隔符,与“&”通常的方式相同,因此 'events' 的值在该点结束,[=11 将出现一个空值=]. 您应该在卷曲行中对字符串进行编码:
'events=[{"event":"reset", "test":"reset%38123"}]'
如果您通过 jQuery 和 $.post 执行 post,此编码将自动发生。