【问题标题】:Dict keys change after passing it to json.dump and json.load [duplicate]将字典键传递给 json.dump 和 json.load [重复]
【发布时间】:2020-09-24 18:35:56
【问题描述】:

我想将字典转储到 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}

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

任何帮助表示赞赏。

【问题讨论】:

  • 我不确定问题到底是什么,或者你想要得到什么输出。正如您所说,由于 JSON 仅允许字符串作为对象键,因此您在解析文档时将无法避免获取字符串。您是否正在寻找解决这个问题的方法? “复杂案件”是什么意思?您可以使用pickle 作为替代。
  • 你为什么使用字典而不是列表,什么是“复杂情况”?

标签: python json python-3.x dictionary io


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在 JSON 中,键必须是字符串。

    因此,一旦您将字典转储为 JSON,当您再次加载它时,就无法按原样返回它。此类信息已不为人知。

    如果需要,您可以查看此问题以了解其他复杂情况。它是关于使用pickle 而不是JSONhttps://stackoverflow.com/a/17328255/8528141

    【讨论】:

      【解决方案3】:

      正如其他答案所暗示的那样,JSON 确实要求所有键都是字符串。因此,如果您将 dict 存储为 JSON 格式,那么您的所有键都将变为字符串,并且在将 dict 加载回来后,您将获得字符串中的键。

      如果您想以相同的格式存储和加载字典,那么您可以将 key_type 与字典一起保存,或者您可以考虑使用 pickle 库来存储和加载 Python 数据结构而不更改任何内容。

      【讨论】:

        猜你喜欢
        • 2012-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-09
        • 2014-07-01
        • 2021-03-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多