JSON库将空格字符解释为"\xa0"。

3
当我将一个json文件加载到Python中时,只要将文件视为字符串处理,就不会出现编码问题。然而,如果使用json.load加载文件或使用json.loads加载字符串,则所有空格字符都会变成"\xa0"。
以下代码可产生正常结果,打印json字符串而没有任何奇怪的"\xa0"标记。
with open(json_path) as f:
    lines = f.readlines()
    for line in lines:
        print(line)

将文件加载为JSON格式时,突然发现空格字符被解释为“\xa0”。

with open(json_path) as f:
    data = json.load(f)
    print(data.keys())

给出以下结果:

dict_keys(['1.\xa0\lorem\xa0ipsum', '2.\xa0\lorem\xa0ipsum\xa0\lorem\xa0ipsum', '3.\xa0\lorem', '4.\xa0\lorem\xa0ipsum', '5.\xa0\lorem\xa0ipsum'])

使用json.loads加载字符串而不是文件会得到相同的结果:

with open(json_path) as f:
    lines = f.read()

data = json.loads(s)
print(data.keys())

我正在使用Java和pdf-box构建一个PDF解析器。将标题结构解析到自己的JSON树中。我尝试将JSON文件转换为Java中的Hashmap,这个功能很好,因此JSON文件本身没有任何奇怪的问题。这是一个特定于Python的问题吗?是否有任何解释?


与JSON无关。在JSON中,\x转义是不合法的。 - Tom Blodget
1个回答

1
假设:
1. 您的JSON文件是有效的,并使用UTF-8编码。 2. 您的JSON文件包含具有不间断空格的键。
那么您得到的输出是完全正确的。
第一段代码读取并打印字符串:
with open(json_path) as f:
    lines = f.readlines()
    for line in lines:
        print(line)

当您打印字符串时,它会以几乎不变的形式输出,并且非断行空格看起来与普通空格相同。
第二段代码解析JSON文件,从而创建一个字典,然后打印字典键。为了简化说明,假设打印字典本身(而不是键):
with open(json_path) as f:
    data = json.load(f)
    print(data)

将字典作为参数调用print函数会调用字典的__str__函数。 __str__函数使用它自己的规则来格式化输出,例如它用大括号括起字典,在其中添加单引号等。

如果您研究输出,您可能会发现打印字典会创建一个有效的Python字典代码

在Python字符串中,某些字符需要转义。 转义序列以反斜杠开头。 典型的例子是换行符:

d = {'line1\nline2': 3}
print(d)

输出:

{'line1\nline2': 3}

__str__字典逻辑的一部分显然也是转义非断空格,因为它们与常规空格在视觉上无法区分(尽管这并不是严格必要的)。在Python中正确的转义方式是\a0

所以一切都按设计工作。这是一个功能,而不是一个错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接