2016-11-21 23 views
4

私は、いくつかのREST APIを開発するためにpythonとdjangoを使用しています。リクエストの呼び出しによって返されたJSONユニコード文字列に関する質問があります。だから、私は何かやっている:これは何か印刷しhttp応答によって返されるjsonオブジェクト

for o in obj: 
    print o 

これにより
resp = requests.get(self.url) 
if resp.status_code is status.HTTP_200_OK: 
    obj = json.loads(resp.json()) 

を、私はエントリを反復処理することができます

{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 

ユニコード文字列の各文字を繰り返し処理するだけです。では、JSONエントリを繰り返し処理する場合は、loadsメソッドを再度実行することになっていますか? resp.json()によって返されたすべてのJSONレコードを反復処理する正しい方法は何でしょうか。

+0

私はちょっと混乱しています - 'requests.get'はdjangoまたは[requests](http://docs.python-requests.org/ja/master/)に関連していますか? – dahrens

答えて

5

あなたは正しい、resp.json()json.loads()を呼び出しますか。

したがって、resp.json()が文字列を返すと、APIによってjsonがデータを2回エンコードしていることが示唆されます。たとえば、{"pk": 1}の代わりに"{\"pk\": 1}"が返されます。

APIを制御できない場合は、Pythonオブジェクトを取得するためにAPIを2回デコードする必要があります。

+0

返されるデータは 'data = serializers.serialize(" json "、types)です。返信(data)' – Luca

+1

@Luca Djangoには、dictsやリストのようなオブジェクトを直接渡すことができる 'JsonResponse'があります。 – schwobaseggl

+2

ResponseがDRFからのものである場合、それはあなたのために物事をシリアライズします。 DRFのドキュメントノートでは、既にレンダリングされたJSONではなくPythonプリミティブ(例えばdictsやリスト)を渡すべきです。標準のHttpResponseを使うか、DjangoのものよりもDRFのシリアライザを使う。 –

関連する問題