Python json.loads->;TypeError:JSON对象必须是str,而不是';dict';

Python json.loads->;TypeError:JSON对象必须是str,而不是';dict';,python,json,mod-wsgi,pyramid,Python,Json,Mod Wsgi,Pyramid,我正在使用Python(版本:3.4.4)金字塔框架接收json请求,并使用json.load将接收到的json转换为Python对象。当使用TestApp对下面列出的应用程序进行单元测试时,一切正常,但是,当通过Apache mod_wsgi使用时,我确实在json.loads中收到以下错误(…) TypeError:JSON对象必须是str,而不是“dict” 知道为什么吗 查看代码: @view_config(route_name='api.analysis', request_metho

我正在使用Python(版本:3.4.4)金字塔框架接收json请求,并使用json.load将接收到的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"})
  ...

request.json\u body
已经将body解码为python对象。如果您希望自己解码,那么应该通过
加载(request.body.decode(request.charset),…)使用原始正文

我猜Pyramid已经在为您将json转换为dict了?听起来它已经是dict了。为什么在mod_wsgi的测试中,而不是在TestApp的单元测试中?为什么您希望两个不相关的软件在没有先阅读文档的情况下表现相同?您没有显示变量
content
的位置从您的代码示例中。可以添加缺少的行吗?编码是
json.loads(s,econding=None,…)
的第二个参数,但默认为
utf-8
。您只需要自己解码字符串,它是UCS-2或类似的:“如果
s
str
实例,并且使用基于ASCII的编码而不是utf-8(例如拉丁语-1)进行编码,则必须指定适当的
编码
名称。非基于ASCII的编码(例如UCS-2)不允许,应首先解码为unicode。这很好,但在本文中,它实际上应该是显式的
request.charset
(如果请求没有在内容类型中进一步指定,则默认为utf-8..,并且方便地将application/json默认为utf-8,以便默认值匹配)我将更新我的答案以反映这一点。