我需要一个JSON HTTP响应如下:
{date: "\/Date(1411084800000)\/"}
我有一个python dict event
,其属性日期为
event['date'] = "\/Date(1411084800000)\/"
现在当我使用烧瓶返回dict时,我将它传递给jsonify
。不幸的是,它逃脱了单个反斜杠并为JSON添加了一个双反斜杠。 \\/Date("1411084800000")\\/
。我需要摆脱双背斜线,我该怎么做?
你想知道我为什么要回复这样的疯狂结果? 那就是Kendo Scheduler期望日期对象的方式。见http://demos.telerik.com/kendo-ui/scheduler/index
任何帮助将不胜感激。谢谢!
答案 0 :(得分:2)
您正在看到转义正斜杠。 JSON标准允许转义任何字符,并且可以通过在其前面加上反斜杠来转义正斜杠。请参阅Strings section of RFC 7159。
所以\/
是只是值/
的转义表示形式:
>>> import json
>>> print json.loads(r'{"date": "\/Date(1411084800000)\/"}')
{u'date': u'/Date(1411084800000)/'}
请注意\/
如何在输出中解码为/
。 此转义完全是可选的。
您的浏览器做同样的事情;当正在解析包含包含\/
序列的字符串的任何兼容JSON值时,生成的字符串值包含只 /
正斜杠。当收到Kendo JSONP response(在字符串中使用\/
)时,浏览器会生成与JSONP响应完全相同的结果,并且正斜杠不会被转义。< / p>
只需使用正斜杠提供Python中的值即可。 json.dumps()
不会转义正斜杠(它不会让转义它),并且您的浏览器和任何其他符合JSON的解析器将生成完全相同的值:
>>> print json.dumps({'date': '/Date(1411084800000)/'})
{"date": "/Date(1411084800000)/"}
答案 1 :(得分:0)
虽然Martijn是完全正确的,但他确实提到了关于远端是否合规的警告。如果它不像JustGiving那样,那么您可能会发现以下内容是一个有用的起点:
class DateJSONEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, datetime.date):
javascript_date = int(o.strftime("%s"))*1000
return r'\/Date({0}+0000)\/'.format(javascript_date)
return JSONEncoder.default(self, o)
def encode(self, o):
encoded = super(DateJSONEncoder, self).encode(o)
encoded = encoded.replace(r"\\/", r"\/").replace(r")\\/", r")\/")
return encoded