4

RoR と Rails でいくつかのコーディングを行いました。API 呼び出しを介して JSON オブジェクトを返すと、次のように返されます。

{ "id" : "1", "name" : "Dan" }.

ただし、Python (Flask および Flask-SQLAlchemy を使用) では、json.dumps または jsonpickle.encode を介して JSON オブジェクトを返すと、次のように返されます。

"{ \"id\" : \"1\", \"name\": \"Dan\" }"これは、反対側で (この場合は iOS アプリ - Obj-C) で簡単に解析できないため、非常に扱いにくいようです。

ここで何が欠けていますか? JSON 文字列ではなく JSON リテラルとして返すにはどうすればよいですか?

これは私のコードがどのように見えるかです:

people = models.UserRelationships.query.filter_by(user_id=user_id, active=ACTIVE_RECORD)
friends = people.filter_by(friends=YES)

json_object = jsonpickle.encode(friends.first().as_dict(), unpicklable=False, keys=True)
print(json_object)  # this prints here, i.e. { "id" : "1", "name" : "Dan" }

return json_object # this returns "{ \"id\" : \"1\", \"name\": \"Dan\" }" to the browser
4

4 に答える 4

3

ここであなたの理解に欠けているのは、Python で JSON モジュールを使用する場合、JSON オブジェクトを操作していないということです。JSON は、定義上、特定の標準に一致する単なる文字列です。

あなたが文字列を持っているとしましょう:

friends = '{"name": "Fred", "id": 1}'

このデータを Python で操作する場合は、Python オブジェクトにロードする必要があります。

import json
friends_obj = json.loads(friends)

この時点で friends_obj は Python 辞書です。

それ(または他のpython辞書またはリスト)を変換したい場合は、json.dumpsが便利な場所です:

friends_str = json.dumps(friends_obj)
print friends_str
'{"name": "Fred", "id": 1}'

ただし、元のフレンド文字列を「ダンプ」しようとすると、別の結果が得られることがわかります。

dumped_str = json.dumps(friends)
print dumped_str
'"{\\"name\\": \\"Fred\\", \\"id\\": 1}"'

これは、基本的に通常の文字列を JSON としてエンコードしようとしていて、文字をエスケープしているためです。これが物事を理解するのに役立つことを願っています!

乾杯

于 2013-10-31T22:35:54.870 に答える
2

ここでDjangoを使用しているようです。その場合、次のようにします

from django.utils import simplejson as json
...
return HttpResponse(json.dumps(friends.first().as_dict()))
于 2013-10-31T22:18:53.830 に答える
1

これはほとんどの場合、どこかでデータを二重にエンコードしていることを示しています。例えば:

>>> obj = { "id" : "1", "name" : "Dan" }
>>> j = json.dumps(obj)
>>> jj = json.dumps(j)
>>> print(obj)
{'id': '1', 'name': 'Dan'}
>>> print(j)
{"id": "1", "name": "Dan"}
>>> print(jj)
"{\"id\": \"1\", \"name\": \"Dan\"}"

ここで、jjは完全に有効な JSON 文字列表現ですが、 の表現ではなくobj、 string の表現であり、役に立ちませんj

通常、これを直接行うことはありません。代わりに、そもそもオブジェクトではなく JSON 文字列で開始したか (たとえば、クライアント要求またはテキスト ファイルから取得した)、ライブラリ内の関数を呼び出したrequestsか、既に-エンコードされた文字列。しかし、いずれにせよ、同じ問題であり、解決策も同じです。二重エンコードしないでください。jsonpicklejson.dumps

于 2013-10-31T22:34:20.250 に答える
0

を使用する必要がありますflask.jsonify。これにより、正しくエンコードされるだけでなく、それcontent-typeに応じてヘッダーも設定されます。

people = models.UserRelationships.query.filter_by(user_id=user_id, active=ACTIVE_RECORD)
friends = people.filter_by(friends=YES)

return jsonify(friends.first().as_dict())
于 2013-11-03T00:03:54.547 に答える