我正在尝试猎鹰的小型api项目。不幸的是我坚持使用json解析东西,文档示例中的代码不起作用。
我已尝试过在Stack和Google上找到的很多东西,但没有任何变化。 我尝试过以下代码导致以下错误
import json
import falcon
class JSON_Middleware(object):
def process_request(self, req, resp):
raw_json = json.loads(req.stream.read().decode('UTF-8'))
"""Exception: AttributeError: 'str' object has no attribute 'read'"""
raw_json = json.loads(req.stream.read(), 'UTF-8')
"""Exception: TypeError: the JSON object must be str, not 'bytes'"""
raw_json = json.loads(req.stream, 'UTF-8')
"""TypeError: the JSON object must be str, not 'Body'"""
我正在放弃,但如果有人能告诉我为什么会这样,以及如何在Falcon中解析JSON,我将非常感激。
由于
环境: OSX Sierra Python 3.5.2 Falcon和其他是Pip的最新版本
答案 0 :(得分:2)
如果其他代码段到位,您的代码应该可以正常工作。快速测试(文件名app.py):
import falcon
import json
class JSON_Middleware(object):
def process_request(self, req, resp):
raw_json = json.loads(req.stream.read())
print raw_json
class Test:
def on_post(self,req,resp):
pass
app = application = falcon.API(middleware=JSON_Middleware())
t = Test()
app.add_route('/test',t)
运行:gunicorn app
$ curl -XPOST 'localhost:8000' -d '{"Hello":"wold"}'
答案 1 :(得分:1)
您必须使用encode()
之类的内容调用read()
返回的字节req.stream.read().encode('utf-8')
。
这样,json.loads()
按预期将字节转换为str。
另一种不打扰所有这些无聊和容易出错的编码/解码和字节/ str的东西(在Py2和Py3中BTW不同)的方法是使用simplejson作为json的替代品。它与API兼容,因此唯一的变化是在代码中将import json
替换为import simplejson as json
。
此外,它简化了代码,因为可以使用json.load(req.bounded_stream)
来完成阅读正文,这比json.loads(req.bounded_stream.read().encode('utf-8'))
更短,更易读。
我现在这样做了,不再使用标准的json模块了。