[英]Confused by Python returning JSON as string instead of literal
我已經在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
看起來您在這里使用的是Django,在這種情況下,請執行以下操作
from django.utils import simplejson as json
...
return HttpResponse(json.dumps(friends.first().as_dict()))
您在這里所缺乏的理解是,當您在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,並且它轉義了字符。 我希望這有助於理解事情!
干杯
這幾乎總是表明您正在某處對數據進行雙重編碼。 例如:
>>> 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
的表示形式,而是字符串j
的表示形式,這是沒有用的。
通常,您不直接這樣做; 取而代之的是,要么從JSON字符串而不是對象開始(例如,是從客戶端請求或文本文件獲得的),要么您在庫中調用了諸如requests
或jsonpickle
隱式調用json.dumps
函數json.dumps
使用已編碼的字符串。 但是,無論哪種方式,都是相同的問題,采用相同的解決方案:只是不要雙重編碼。
您應該使用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())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.