簡體   English   中英

由Python混淆,返回JSON作為字符串而不是文字

[英]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字符串而不是對象開始(例如,是從客戶端請求或文本文件獲得的),要么您在庫中調用了諸如requestsjsonpickle隱式調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM