【问题标题】:newline causes SyntaxError: EOL while scanning string literal换行导致 SyntaxError: EOL 在扫描字符串文字时
【发布时间】:2013-04-25 14:42:14
【问题描述】:

一个 ipad 应用程序将此 json 发送给我,我通过 request.POST.get 读取它,然后通过 ast.literal_eval

解析它
u'[\n {\n "type" : 2,\n "dateCreated" : "Wed, 24 Apr 2013 17:20:50 0100",\n "dateStart" : "Wed, 24 Apr 2013 18:00:00 0100",\n "appointmentId" : 0,\n "withP" : [\n\n ],\n "seenTime" : null,\n "ofCWithId" : 2,\n "ofClientWithId" : 68,\n "dateEnd" : "Wed, 24 Apr 2013 19:00:00 0100",\n "comments" : "Test test test\n.\n( ) \'\' test \'\' \' test \'\n",\n "inLocation" : null,\n ...bla bla bla...]'

我收到此错误:

    'comments' : 'Test test test
                               ^
SyntaxError: EOL while scanning string literal

我可以理解换行符是问题,但我不知道如何解决。我正在使用 django 1.4.2 python 2.7.3

非常感谢您的帮助

【问题讨论】:

  • 这个文本是如何生成的?解决此问题的唯一方法是从引用的字符串中删除换行符,但这基本上需要您从头开始编写解析器。
  • 另外你的最后一句话没有被引用,所以这也会给你一个 SyntaxError。
  • 一个 ipad 应用程序将此 json 发送给我,我通过 request.POST.get 读取它,然后通过 ast.literal_eval 解析它。由于错误消息在测试测试导致问题后显示换行符。
  • 既然这应该是JSON,为什么不用json库来解析呢?
  • @DanielRoseman 我将其更改为 json.loads 并解决了问题,谢谢。

标签: python django python-2.7 newline


【解决方案1】:

尝试在字符串的开头和结尾添加\'\'\'。

像这样:

u'\'\'\'[\n ... bla bla bla...]\'\'\''

【讨论】:

    【解决方案2】:

    不应该使用 ast.literal_eval 来读取 JSON。对于读取 JSON,有一个单独的module called json

    使用它加载 JSON 数据:

    import json
    data = """{"type":null,"dateCreated":"Wed, 24 Apr 2013 17:20:50 0100"}"""
    json_data = json.loads(data)
    

    ast.literal_eval 用于评估表示为字符串的 Python 代码。它不是为处理 JSON 数据而设计的。 JSON 中的 null 是 Python 字典中的 None,作为差异的示例。

    您收到错误的另一个原因是您尝试解析的 JSON 无效。似乎存在服务器端问题,或者您从服务器获取 JSON 数据的方式存在问题。

    换行符 (\n) 应在字符串中进行转义。此外,根据JSON specs,不应转义'。或者,您可以使用 strict=False 参数和 json.loads 来允许字符串中的控制字符。

    您示例中的有效 JSON 如下所示:

    {
        "type": 2,
        "dateCreated": "Wed, 24 Apr 2013 17:20:50 0100",
        "dateStart": "Wed, 24 Apr 2013 18:00:00 0100",
        "appointmentId": 0,
        "withP": ["\\n\\n"],
        "seenTime": null,
        "ofCWithId": 2,
        "ofClientWithId": 68,
        "dateEnd": "Wed, 24 Apr 2013 19:00:00 0100",
        "comments": "Test test test\\n.\\n( ) '' test '' ' test '\\n",
        "inLocation": null
    }
    

    【讨论】:

    • json.loads 也发生在我身上
    猜你喜欢
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多