【问题标题】:json.loads -> TypeError: the JSON object must be str, not 'dict'json.loads -> TypeError:JSON 对象必须是 str,而不是 'dict'
【发布时间】:2018-04-26 17:44:09
【问题描述】:

我正在使用 Python(版本:3.4.4)Pyramid 框架来接收 json 请求,并使用 json.loads 将接收到的 json 转换为 python 对象。当使用 TestApp 对下面列出的应用程序进行单元测试时,一切正常,但是,当通过 Apache mod_wsgi 使用时,我在 json.loads(...) 中收到以下错误

TypeError: JSON 对象必须是 str,而不是 'dict'

知道为什么吗?

查看代码:

@view_config(route_name='api.analysis', request_method='POST', renderer='json')
def fetch_my_info(request):
  data = json.loads(request.json_body, object_hook=lambda d: namedtuple('X', d.keys())(*d.values()))
  ...

测试代码:

  self.testApp = TestApp(app)
  response = self.testApp.post_json('/v1/info/analysis', params={"id", "123"})
  ...

【问题讨论】:

  • 我猜 Pyramid 已经为您将 json 转换为 dict 了?
  • 听起来已经是字典了
  • 为什么在使用 mod_wsgi 的测试中而不是在使用 TestApp 的单元测试中?
  • 为什么你期望两个不相关的软件在不先阅读文档的情况下表现相同?
  • 您没有在代码示例中显示变量 content 的来源。你能补充一下缺失的行吗?

标签: python json mod-wsgi pyramid


【解决方案1】:

request.json_body 已经为您将主体解码为 python 对象。如果您想自己解码,则应通过loads(request.body.decode(request.charset), ...) 使用原始正文。

【讨论】:

  • 编码是json.loads(s, econding=None, ...) 的第二个参数,但默认为utf-8。您只需要自己解码字符串,它是 UCS-2 或类似的:“如果 sstr 实例并且使用基于 ASCII 的编码而不是 utf-8(例如 latin-1)进行编码,那么适当的 @必须指定 987654327@ 名称。不允许使用不基于 ASCII 的编码(例如 UCS-2),应首先将其解码为 unicode。"
  • 这很好,但在这种情况下,它实际上应该是明确的request.charset(如果请求没有在内容类型中进一步指定,它将默认为 utf-8 .. 并且方便 application/json 默认为utf-8 所以默认值匹配)我将更新我的答案以反映。
猜你喜欢
  • 2017-08-11
  • 2019-10-10
  • 1970-01-01
  • 2019-08-27
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
相关资源
最近更新 更多