2016-10-09 146 views
0

我正在嘗試一個小的api項目獵鷹。不幸的是我卡在json解析的東西和文檔示例代碼不起作用。Falcon解析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'""" 

我想要放棄的方式,但如果有人能告訴我爲什麼發生這種情況,以及如何在獵鷹解析JSON我會非常感謝。

感謝

環境: OSX塞拉利昂 的Python 3.5.2 隼等是從皮普

最新版本

回答

1

你的代碼應該工作,如果代碼的其他部分到位。快速測試(文件名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"}'

+0

嗨,謝謝你的迴應。這個例子幾乎是我所做的,但是做了一個複製粘貼女巫導致了「TypeError:JSON對象必須是str,而不是'bytes'」。在Ubuntu上測試一個虛擬機,它工作得很好。這很奇怪。試圖重新安裝,但沒有幫助。想法? :-) – Audunfr

+0

@Aununfr如果你發現這個答案是正確的,然後接受它。 – anekix

1

你必須調用由read()的東西,如req.stream.read().encode('utf-8')返回的字節encode()

這樣,字節被轉換成一個STR通過json.loads()如預期。

另一種不用擔心所有這些無聊和容易出錯的編碼/解碼和bytes/str的東西(在Py2和Py3中有所不同),是使用simplejson作爲json的替代品。它是API兼容的,所以唯一的變化是在代碼中用import simplejson as json代替import json

此外,它簡化了代碼,因爲可以使用json.load(req.bounded_stream)來完成對身體的讀取,這比json.loads(req.bounded_stream.read().encode('utf-8'))更短且更具可讀性。

我現在這樣做了,不要再使用標準的json模塊了。