【问题标题】:json parsing with escape characters clarificationjson 解析与转义字符说明
【发布时间】:2019-11-20 16:57:19
【问题描述】:

我知道在处理特殊转义字符时,json 解析有很多类似的问题,但是我无法找到解决方案。我想要做的是将以下内容保存到一个 json 文件中,稍后我可以使用 python 中的 json 模块将其作为字典检索。我的json是这样的

{"head":{"body":{"/^\s+|\s+$":"", "\s+":" "}}}

当我尝试将它放入 json 并加载时,它会给我一个预期的解析错误,因为没有转义反斜杠。因此,我将其更正如下(基于 SO 的建议):

{"head":{"body":{"/^\\s+|\\s+$":"", "\\s+":" "}}}

但是,当我将它加载到字典时,虽然它会解析,但它给我的字典如下:

{"head":{"body":{"/^\\s+|\\s+$":"", "\\s+":" "}}}

而不是预期的一个反斜杠。如何处理它,使我的 \s 只有一个反斜杠而不是两个。我也想过用 ast.literal_eval() 来读取数据,但不想那样做。有关如何处理此问题的任何建议。

【问题讨论】:

  • 可以使用替换
  • 试试r"/^\s+|\s+$",r代表raw
  • r 在 jsons 中不起作用。我试过了。 JSONDecodeError:期望用双引号括起来的属性名称。一切都必须用双引号引起来。
  • 这似乎是不可能的。看到这个stackoverflow.com/questions/49763394/…
  • @RahulRaut :看来你是对的。 Tbh 试图获得一个反斜杠而感到恼火。尝试过各种版本,例如“\u005C”,但似乎不可能获得单个反斜杠()。感谢分享链接。因此,有关如何处理此问题的任何建议。我现在正在考虑将文件保存为 txt 而不是 json,然后使用 ast。如果可行,将在此处更新

标签: python json dictionary


【解决方案1】:

你有一个包含几个正则表达式的数据结构。在 Python 语法中,这将是:

data = {
    'head': {
        'body': {
            r'^\s+|\s+$': '',
            r'\s+': ' '
        }
    }
}

当您将此数据转换为 JSON 并将其存储在文件中时:

import json

with open('test.json', 'w', encoding='utf8') as fp:
    json.dump(data, fp)

并在文本编辑器中打开生成的文件,您将看到:

{"head": {"body": {"^\\s+|\\s+$": "", "\\s+": " "}}}

当你再次对这个文件进行 JSON 解析时:

with open('test.json', encoding='utf8') as fp:
    data = json.read(fp)

print(data)

Python 会打印这个:

{'head': {'body': {'^\\s+|\\s+$': '', '\\s+': ' '}}}

...这与我们最初的完全相同,只是最初我们使用了raw string literals r'...',但 Python 的print() 永远不会输出这种特定格式。

您最初想要的 JSON 文件中的内容:

{"head":{"body":{"/^\s+|\s+$":"", "\s+":" "}}}

不是 JSON,没有任何理由尝试实现这种格式。

结论

  • JSON 是一个字符串(JSON 绝不是字符串,尤其是它绝不是“对象”或“数组”)。
  • JSON 字符串必须被解析。除了将 JSON 字符串提供给 JSON 解析器(或将其存储在文件或数据库中或通过网络发送)之外,请勿将 JSON 字符串用于任何其他用途
  • 尤其不要对 JSON 字符串使用替换或正则表达式等字符串操作,因为这很容易破坏它们。
  • 使用 JSON 库将数据结构转换为 JSON 并返回,避免“随意”和手动编写 JSON。尤其是当数据包含复杂结构(如正则表达式),并且您不能 100% 确定 JSON 语法规则时。
  • 没有理由担心 JSON 中的反斜杠数量,因为这根本不重要。
  • 以上示例使用 Python,同样的方法适用于任何其他编程语言。

【讨论】:

  • 感谢您提供非常明智的回答。所以只是一个查询,因为我还没有尝试过,所以当你说“没有理由担心 JSON 中的反斜杠数量”时,你说得对,我想保存这些正则表达式模式和其他模式喜欢它。我打算在正则表达式替换功能中使用键值的函数中使用它们。所以,我知道得到一个单斜杠是不可能的,因为它不是 json 格式,但不会得到一个双斜杠会改变正则表达式模式。那么出路是什么?有什么建议吗?
  • 我不知道你的“出路”是什么意思。出于什么?上述过程的输入和输出完全是一回事。在之前和之后尝试for regex in data['head']['body']: print(regex)
  • 明白。会检查出来。感谢您帮助解释 json 的工作原理。
  • JSON 存储 \\ 来表示 \。当你解析它时, \\ 再次变为 \ 。您的单个反斜杠从未消失,您无需做任何事情来“保留”或“恢复”它。停止计算 JSON 中有多少个反斜杠,这不是你关心的问题,这是 JSON 解析器关心的问题。
  • 不,这并不矛盾。在我的回答中,我最初使用的是原始字符串文字(请参阅更新,我已经粘贴了一个解释它们的链接)。 Python 字符串文字 使用 \\ 来表示 \,就像 JSON 一样。当 Python 源代码被读取时,\\ 变成 \,就像 JSON 一样。当你 print() 一个包含单个 \ 的字符串到控制台时,Python 会再次将其转换为 \\。
猜你喜欢
  • 1970-01-01
  • 2018-01-20
  • 2020-02-05
  • 1970-01-01
  • 2021-09-18
  • 2017-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多