2016-11-21 174 views
4

我正在使用python和django來開發一些REST API。我有一個關於請求調用返回的JSON unicode字符串的問題。所以,我做這樣的事情:json對象由http響應返回

resp = requests.get(self.url) 
if resp.status_code is status.HTTP_200_OK: 
    obj = json.loads(resp.json()) 

有了這個,我可以遍歷條目:

for o in obj: 
    print o 

這將打印類似:

{u'pk': 1, u'model': u'aslapp.imagetypemodel', u'fields': {u'type': u'PNG'}} 
{u'pk': 2, u'model': u'aslapp.imagetypemodel', u'fields': {u'type': u'JPG'}} 

但是,我讀了resp.json()調用應該在內部調用這個json.loads()方法,並將照顧編碼的東西。然而,只是在做:

obj = resp.json() 
for o in obj: 
    print o 

只是遍歷unicode字符串中的每個字符。那麼我是否應該通過loads方法再次運行它,如果我想遍歷JSON條目?遍歷resp.json()返回的所有JSON記錄的正確方法是什麼?

+0

我有點困惑 - 'requests.get'與django或[requests](http://docs.python-requests.org/en/master/)有關? – dahrens

回答

5

你是對的,resp.json()確實爲你打電話json.loads()

因此,如果resp.json()返回一個字符串,則表明API已經將json編碼了兩次數據。例如,它將返回"{\"pk\": 1}"而不是{"pk": 1}

如果您對API沒有任何控制權,那麼您必須對其進行解碼兩次以獲取Python對象。

+0

沒錯。所以在Django方面,返回的數據是'data = serializers.serialize(「json」,types)return Response(data)' – Luca

+1

@Luca Django也有一個'JsonResponse',你可以直接傳遞類似於dicts或lists的對象。 – schwobaseggl

+2

如果響應來自DRF,那麼它會爲您序列化一些東西;正如DRF文檔所指出的那樣,您應該傳遞Python原語(例如字典和列表)而不是已經呈現的JSON。使用標準的HttpResponse,或者使用DRF的序列化器而不是Django的序列化器。 –