将带有转义 unicode 的 json 文件转换为真正的 unicode,同时保留转义双引号

Converting a json file with escaped unicode to real unicode while retaining escaped double quotes

我在 json 文件中有一个转义的 unicode 字符串,例如:

{"word": "\u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u043a \u043d\u0430 \u0433\u043e\u0440\u0435 \u0441\u0432\u0438\u0441\u0442\u043d\u0435\u0442",
"glosses": ["when pigs fly, never (lit., \"when the crawfish whistles on the mountain\")"]}}

我想转换此文件以显示正确的 unicode。在 Python 中,我找到了一些建议,例如:

import codecs

# opens a file and converts input to true Unicode
with codecs.open("kaikki.org-dictionary-Russian.json", "rb", "unicode_escape") as my_input:
contents = my_input.read()
# type(contents) = unicode 

# opens a file with UTF-8 encoding
with codecs.open("utf8-dictionary.json", "wb", "utf8") as my_output:
my_output.write(contents)

我也写了另一个类似的函数,但没有使用“编解码器”,但都得到了相同的结果。执行命令后,我得到:

{"word": "когда рак на горе свистнет", 
"glosses": ["when pigs fly, never (lit., "when the crawfish whistles on the mountain")"]}

转义后的双引号不再转义,导致JSON无效。我怎样才能避免这种情况?

编辑:我忘了说我的文件是 json 行格式,所以每一行都是一个 json 对象,以 { ... } 开头和结尾。

感谢大家的帮助!我的最终解决方案:

import json

with open("kaikki.org-dictionary-Russian.json", "r", encoding="utf-8") as input, \
open("utf8-dictionary-4.json", "w", encoding="utf-8") as out:
for line in input:
    data = json.loads(line) 
    json.dump(data, out, ensure_ascii=False)
    out.write("\n")

使用 json 库处理 JSON 数据。 它将确保序列化数据是有效的 JSON,并且它有一些控制输出的选项,例如缩进漂亮打印和非 ASCII 字符而不转义。

首先,用json.load()解析数据:

>>> with open("kaikki.org-dictionary-Russian.json", encoding="utf8") as f:
...     data = json.load(f)

注意:在 Python 3 中,reading/writing 文件不需要使用 codecs 库。只需在内置 open 函数中指定文件编码即可。

再次序列化数据,现在使用 ensure_ascii 选项,这导致转义序列的使用最少(只有双引号、换行符和制表符被转义 IIRC):

>>> with open("utf8-dictionary.json", "w", encoding="utf8") as f:
...     json.dump(data, f, ensure_ascii=False)