猿问

将字典键传递给 json.dump 和 json.load 后会发生变化

我想将一个字典转储到一个 json 文件中,然后加载它以便我使用它。


dic = {}


for n in range(1,10):

    if n%2==0:

        dic[n] = n**2

    else:

        dic[str(n)] = n**2

print(dic)

打印输出是:


{'1': 1, 2: 4, '3': 9, 4: 16, '5': 25, 6: 36, '7': 49, 8: 64, '9': 81}

这是我想要的结果但是当我json.dump和json.load它...


with open("myfile.json","w") as fp:

    json.dump(dic,fp)

with open("myfile.json") as fq:

    newdic=json.load(fq)


print(newdic)

输出是:


{'1': 1, '2': 4, '3': 9, '4': 16, '5': 25, '6': 36, '7': 49, '8': 64, '9': 81}

所有的键都变成了字符串。在这种简单的情况下是可以避免的,但是在复杂的情况下我该怎么办呢?


任何帮助表示赞赏。


天涯尽头无女友
浏览 138回答 3
3回答

ABOUTYOU

JSON 规范要求所有键都是字符串。在 Python 中情况并非如此,其中不是字符串的对象可以是字典中的键。

肥皂起泡泡

在 JSON 中,键必须是字符串。因此,一旦将字典转储为 JSON,就无法在再次加载时按原样返回。这种信息已经不为人知。如果需要,您可以针对其他复杂情况检查此问题。它是关于使用pickle而不是JSON: https ://stackoverflow.com/a/17328255/8528141

慕丝7291255

正如其他答案所暗示的那样,JSON 确实要求所有键都只能是字符串。因此,如果您将字典存储为 JSON 格式,那么您所有的键都会变成字符串,并且在加载字典时您会得到字符串中的键。如果你想以相同的格式存储和加载 dict,那么你可以将 key_type 与 dict 一起保存,或者你可以考虑pickle存储和加载 Python 数据结构的库而不改变其中的任何内容。
随时随地看视频慕课网APP

相关分类

Python
我要回答