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



当我将json文件加载到python中时,只要文件被视为字符串,编码就没有问题。然而,在文件上使用json.load或在字符串上使用json.loads将文件加载为json格式,所有空格字符都显示为"\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\xa0ipsim\xa0\psum','3.\xa0\ lorem','4.\xa0\lerem\xa0ippsum','%5.\xa0\leme\xa0ipsm'])

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

with open(json_path) as f:
lines = f.read()
data = json.loads(s)
print(data.keys())

我正在使用java和pdf盒子构建一个pdf解析器。将标题结构解析到我自己的json树中。我已经尝试过用java将json文件转换为Hashmap,这很好,所以json文件本身似乎没有什么奇怪的地方。这是python特有的问题吗?对此有什么解释吗?

假设:

  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)

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

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

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

d = {'line1nline2': 3}
print(d)

输出:

{'line1nline2': 3}

__str__字典逻辑的一部分显然也是为了逃离非破坏空间,因为它们在视觉上无法与规则空间区分开来(尽管这不是严格必要的)。在Python中对其进行转义的正确方法是a0

所以一切都按设计进行。这是一个特性,而不是bug。

最新更新