【问题标题】:reading "prettified" JSON back into python将“美化”JSON读回python
【发布时间】:2021-09-23 17:07:46
【问题描述】:

假设我在 python 中有一个 dict,如下所示:

original = {
    "x": 1.0,
    "y": "Floyd",
    "z": "Floyd\'s friend Larry",
}

dict 得到 JSON 编码,然后写入一个 .ipynb 文件,当在浏览器中查看时,该文件将其美化以供人类使用。我想读取 .ipynb 文件并恢复原始字典。

.ipynb 文件在浏览器中查看时呈现如下:

renders_as = {
    'x': 1.0,
    'y': 'Floyd',
    'z': "Floyd\'s friend Larry",
}

这是可以手动复制和粘贴的python dict,与原始字典等效。

但是,当我使用 python 读取 .ipynb 文件时,我得到了以下字符串:

'{\'x\': 1.0, \'y\': \'Floyd\', \'z\': \\"Floyd\'s friend Larry\\"}'

这不是正确的 JSON,所以我不能 json.loads,而且它不是一个可以使用类似 ast.load_literal 的字符串来分配的字符串,因为双反斜杠解析为行继续。

对我来说,获取此字符串并生成原始输入的最佳方法是什么,同时保护自己免受常见的字符串处理问题(例如处理潜在的嵌套引号)的影响?

【问题讨论】:

标签: python json string


【解决方案1】:

可以先使用unicode-escape处理转义字符串:

import ast

value = '{\'x\': 1.0, \'y\': \'Floyd\', \'z\': \\"Floyd\'s friend Larry\\"}'
value = value.encode("utf-8")
value = value.decode("unicode-escape")
value = ast.literal_eval(value)

# value = {'x': 1.0, 'y': 'Floyd', 'z': "Floyd's friend Larry"}

【讨论】:

    【解决方案2】:

    我采用的解决方案是将 .ipynb 文件作为 JSON 读回内存。 (我一直在逐行阅读普通字符串)。通过以 JSON 格式读取文件,对 json.load() 的调用为我处理了嵌套引号,并将对象保留为正确的字典,我可以使用 ast.literal_eval 读取。

    【讨论】:

      猜你喜欢
      • 2012-02-24
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      相关资源
      最近更新 更多