如何使用jsonify和flask在JSON响应中使用单个反斜杠?

时间:2014-09-17 20:39:05

标签: python json kendo-ui flask

我需要一个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

任何帮助将不胜感激。谢谢!

2 个答案:

答案 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