Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带转义字符的json解析_Python_Json_Dictionary - Fatal编程技术网

Python 带转义字符的json解析

Python 带转义字符的json解析,python,json,dictionary,Python,Json,Dictionary,我知道在处理特殊转义字符时,json解析有许多类似的问题,但是我找不到解决方案。我试图做的是将以下内容保存到一个json文件中,稍后我可以使用python中的json模块将其作为dict检索。我的json是这样的 {"head":{"body":{"/^\s+|\s+$":"", "\s+":" "}}} 当我试图将其放入json并加载时,它会像预期的那样给我一个解析错误,因为反斜杠并没有转义。因此,我更正如下(根据So的建议): 但是,当我将其加载到dict时,虽然它进行了解析,但它给出的d

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

{"head":{"body":{"/^\s+|\s+$":"", "\s+":" "}}}
当我试图将其放入json并加载时,它会像预期的那样给我一个解析错误,因为反斜杠并没有转义。因此,我更正如下(根据So的建议):

但是,当我将其加载到dict时,虽然它进行了解析,但它给出的dict如下所示:

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

而且没有一个反斜杠。如何处理它,以便我的\s只有一个反斜杠而不是两个。我还想过使用ast.literal_eval()读取数据,但不想这样做。关于如何进行此操作的任何建议。

您有一个包含一些正则表达式的数据结构。在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+": " "}}}
再次解析此文件时:

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

print(data)
Python将打印以下内容:

{'head': {'body': {'^\\s+|\\s+$': '', '\\s+': ' '}}}
…这与我们最初使用的格式完全相同,只是我们最初使用了,但是Python的
print()
永远不会输出这种特定格式

您最初希望在JSON文件中显示的内容:

{"head":{"body":{"/^\s+|\s+$":"", "\s+":" "}}}
不是JSON,没有任何理由尝试实现这种格式

结论

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

您可以使用replacetry
r/^\s+\s+$”
相反,r表示rawr在JSON中不起作用。我试过了。JSONDecodeError:属性名应包含在双引号中。每件事都必须用双引号,这似乎是不可能的。看看这个@RahulRaut:看来你是对的。Tbh试图得到一个反斜杠而感到恼火。已经尝试过各种版本,如“\u005C”,但似乎不可能得到一个反斜杠()。谢谢分享链接。那么有没有关于如何处理这一问题的建议呢。我现在考虑将文件保存为txt而不是json,然后使用ast。如果可以的话,我会在这里更新。谢谢你的回答。我还没有尝试过这个查询,所以当你说“没有理由担心JSON中反斜杠的数量”时,你正确地说我想保存这些正则表达式模式和其他类似的模式。我打算在一个函数中使用它们,其中在regex replace功能中使用键值。所以,我知道获取一个斜杠是不可能的,因为它不是json格式,但是获取一个双斜杠不会改变正则表达式模式。那么出路是什么呢?有什么建议吗?我不知道你说的“出路”是什么意思。出于什么?上述过程的输入和输出是完全相同的。请在数据['head']['body']:print(regex)前后对regex尝试
。我去看看。感谢您帮助解释json的工作原理。json存储\\表示\。当您解析它时,\\再次变为\。你的一个反斜杠永远不会消失,你不需要做任何事情来“保留”或“恢复”它。停止计算JSON中有多少反斜杠,这不是你的问题,这是JSON解析器的问题。不,这并不矛盾。在我的回答中,我最初使用的是原始字符串文字(请参阅更新,我粘贴了一个解释它们的链接)。Python字符串文本也使用\\表示\,就像JSON一样。当Python源代码被读取时,\\been\,就像JSON一样。当您
print()
将包含单个\的字符串发送到控制台时,Python会再次将其转换为\\。
{"head":{"body":{"/^\s+|\s+$":"", "\s+":" "}}}