json字符串中的逗号导致json.loads失败并显示“Unterminated string starting at:”

时间:2015-02-03 01:57:10

标签: python json google-app-engine python-2.7 webapp2

这是我的测试命令:

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库。函数调用返回

[{"event":"reset", "test":"reset

而不是

[{"event":"reset", "test":"reset;123"}]

3 个答案:

答案 0 :(得分:0)

其他用户未提供正确答案。问题不是你需要使用不同的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'

答案 1 :(得分:-1)

';'在后数据中被视为分隔符,以同样的方式'&'通常会是,因此'events'的值在该点结束,并且123"}]将存在空值。 你应该在你的curl行编码字符串:

'events=[{"event":"reset", "test":"reset%38123"}]'

如果您使用$ .post通过jQuery执行帖子,则此编码会自动发生。

答案 2 :(得分:-2)

您在请求中发送了一个列表,而不是您应该使用的字符串events=[{"event":"reset", "test":"reset;123"}]

'{"events":[{"event":"reset", "test":"reset;123"}]}'