【问题标题】:How to have a single backslash in JSON response using jsonify and flask?如何使用 jsonify 和烧瓶在 JSON 响应中使用单个反斜杠?
【发布时间】:2014-11-12 01:01:47
【问题描述】:

我需要一个 JSON HTTP 响应如下:

{date: "\/Date(1411084800000)\/"}

我有一个 python dict event,其属性日期为

event['date'] = "\/Date(1411084800000)\/"

现在,当我使用烧瓶返回字典时,我将它传递给 jsonify。不幸的是,它转义了单个反斜杠并在 JSON 中添加了一个双反斜杠。 \\/Date("1411084800000")\\/。我需要去掉双反斜杠,我该怎么做?

你想知道我为什么要返回这样一个疯狂的结果? 这就是 Kendo Scheduler 期望日期对象的方式。见http://demos.telerik.com/kendo-ui/scheduler/index

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

【问题讨论】:

  • 你确定它实际上包含两个反斜杠吗,并且不仅仅是 Python 以这种方式显示它,如 this question 中所述?
  • @BrenBarn 是的,我确定。我使用谷歌浏览器开发者工具查看了 HTTP 响应。
  • 为什么你甚至需要一个反斜杠?您链接到的网页未显示该格式的任何内容。
  • 如何将值分配给event['date']?这里的"s 会导致SyntaxError
  • @dim 抱歉,这是帖子中的错字。 python本身是正确的

标签: python json kendo-ui flask


【解决方案1】:

您看到的是一个转义的正斜杠。 JSON 标准允许转义 any 字符,并且可以通过在正斜杠前面加上反斜杠来转义正斜杠。请参阅Strings section of RFC 7159

所以\/ 是一个只是/ 的转义表示:

>>> import json
>>> print json.loads(r'{"date": "\/Date(1411084800000)\/"}')
{u'date': u'/Date(1411084800000)/'}

注意\/ 如何在输出中解码为/这种转义完全是可选的

你的浏览器做同样的事情;当解析包含包含\/ 序列的字符串的任何合规 JSON 值时,生成的字符串值包含 just / 正斜杠。当接收到Kendo JSONP response(在字符串中使用\/)时,浏览器会生成完全相同的结果作为JSONP响应,正斜杠未转义。

只需在 Python 中提供带有正斜杠的值。 json.dumps() 不会转义正斜杠(它没有 转义它),并且您的浏览器和任何其他符合 JSON 的解析器将产生完全相同的值:

>>> print json.dumps({'date': '/Date(1411084800000)/'})
{"date": "/Date(1411084800000)/"}

【讨论】:

    【解决方案2】:

    虽然 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
    

    【讨论】:

      猜你喜欢
      • 2020-04-03
      • 2018-08-17
      • 1970-01-01
      • 2012-12-21
      • 2019-01-04
      • 1970-01-01
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多