json解析,带有转义字符说明

时间:2019-11-20 16:57:19

标签: python json dictionary

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

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

当我尝试将其放入json并加载时,由于反斜杠未转义,这给了我预期的解析错误。因此,我(根据SO的建议)对其进行了如下纠正:

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

但是,当我将其加载到dict时,尽管它解析了,但它给了我dict如下:

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

,而不是预期的单个反斜杠。如何处理它,这样我的\ s就只有一个反斜杠而没有两个。我也想与ast.literal_eval()一起读取数据,但不想那样做。有关如何执行此操作的任何建议。

1 个答案:

答案 0 :(得分: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,相同的方法适用于任何其他编程语言。