猎鹰解析json错误

时间:2016-10-09 18:00:17

标签: python python-3.x falconframework

我正在尝试猎鹰的小型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的最新版本

2 个答案:

答案 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模块了。