【问题标题】:Comma in json string causes json.loads to fail with "Unterminated string starting at:"json 字符串中的逗号导致 json.loads 失败并显示“未终止的字符串开始于:”
【发布时间】:2015-04-02 03:07:00
【问题描述】:

这是我的测试命令:

curl -v -A 'TEST/1.0' -X POST -d 'events=[{"event":"reset", "test":"reset;123"}]' 'http://127.0.0.1:8080/_api'

这是我的请求处理程序

   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"}]

【问题讨论】:

  • 你能发布 json 字符串...至少前 27 个字符吗?
  • @tdelaney 你能看到有问题的 curl 命令的-d 后面的字符串吗?

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


【解决方案1】:

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

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

【讨论】:

  • 问题是关于谷歌应用引擎的。而且我这里没有多个值(“事件”键包含 one json 字符串)
  • @AnthonyKong 你不是在发送一个字符串,你是在发送一个列表,检查一下。
  • 我现在明白了。测试命令是由第三方给我的,我没有考虑它是否有效。谢谢!
【解决方案2】:

';'在 post-data 中被视为分隔符,与“&”通常的方式相同,因此“事件”的值在该点结束,123"}] 将出现一个空值。 您应该对卷曲线中的字符串进行编码:

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

如果你通过 jQuery 和 $.post 进行发布,这种编码会自动发生。

【讨论】:

    【解决方案3】:

    其他用户没有提供正确答案。问题不在于您需要使用不同的 python 函数来获取 POST 请求参数 - get 是此处使用的正确函数以获取请求字符串 - 问题是您没有发送有效的 JSON 对象.您正在发送一个将 JSON 对象分配给变量 events 的 javascript 表达式。 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'
    

    【讨论】:

      猜你喜欢
      • 2018-08-23
      • 2014-12-19
      • 2014-11-01
      • 2019-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多