python - 将元组作为键的字典转换为 JSON
问题描述
我想将字典转换为 JSON 对象,但我的键是一个元组,因此当我这样做时遇到了问题:
import json
d = {(300, 341): 4, (342, 426): 5}
json.dumps(d)
错误:
TypeError:键必须是 str、int、float、bool 或 None,而不是元组
如果转换为 JSON,我该如何解决这个问题并访问关键元素?
解决方案
如错误所述,元组不能是 JSON 对象的键,您需要某种解决方法。考虑将元组序列化为字符串,但在这种情况下将它们转换回元组可能有点棘手。
d = {str((300, 341)): 4, str((342, 426)): 5}
json.dumps(d)
其他选择是将您存储数据的方式更改为这样的方式
d = [
{'key1': 300, 'key2': 341, 'value': 4},
{'key1': 342, 'key2': 426, 'value': 5}
]
显然,您可以将“key1”和“key2”更改为更有意义的内容。
编辑:正如您提到的,您正在使用范围。这个解决方案怎么样?
def jsonify_data(d):
jsonifable = {'%d:%d' % key: val for key, val in d.items()}
json.dumps(jsonifable)
def dejsonify_data(jd):
d = {}
for key, val in jd.items():
start, end = key.split(':')
d[int(start), int(end)] = val
return d
推荐阅读
- c# - 使用 Rest API 调用执行批量更新/插入 SharePoint 列表项的 C# 代码
- python-3.x - 存储redis哈希和json时如何构造python代码
- r - int NA 的内部表示
- html - 如何使用我的网络服务器读取 html 文件?
- amazon-web-services - 将自定义环境变量添加到 AWS EMR 的标准做法是什么?
- c# - 所有任务都被 ContinueWith [C#].. 阻止,同时调用 Task.Delay 等待应该由其他任务更改的值
- javascript - Chrome 没有加载所有 webpack JS 源文件,但 Firefox + Chrome Incognito 可以
- java-8 - 使用 Java 8,使用 Stream 将类型嵌套列表转换为另一种类型
- path - 错误:找不到工作的 QEMU 可执行文件
- python - 使用python中的正则表达式在C中获取函数内容和函数名