繁体   English   中英

json 解析带转义字符说明

[英]json parsing with escape characters clarification

我知道在处理特殊转义字符时 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() 来读取数据,但不想 go 那样。 关于如何 go 关于此的任何建议。

您有一个包含一些正则表达式的数据结构。 在 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+': ' '}}}

...这与我们最初拥有的完全相同,除了最初我们使用原始字符串文字r'...' ,但 Python 的print()永远不会 output 这种特殊格式。

您最初在 JSON 文件中想要的东西:

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

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

结论

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM