我是Python的新手,我正在尝试用Json编码一个数据字典。
我的结论是:
data = { ('analogInput', 18) : [('objectName','AI8-Voltage'),
('presentValue',238.3),
('units','Volts')],
('analogInput', 3) : [('objectName','AI3-Pulse'),
('presentValue',100),
('units','Amp')]
}当我尝试这样做的时候: foo = json.dumps(data),我得到了这样的消息:致命错误:键必须是字符串、整数、浮点数、布尔值或无,而不是元组
我正在努力寻找答案,但我不知道在我的情况下该如何继续下去
谢谢你的回答
发布于 2021-04-01 16:38:53
首先,并不是所有类型都可以用于JSON键。
JSON键必须是字符串,值必须是有效的
数据类型(字符串、数字、对象、数组、布尔值或null)。
有关更多信息,请查看this。
现在,作为可行的解决方案,我建议您实现两个函数,将元组转换为字符串,并将字符串转换为元组。下面提供了一个非常简单的示例:
import json
data = { ('analogInput', 18) : [('objectName','AI8-Voltage'),
('presentValue',238.3),
('units','Volts')],
('analogInput', 3) : [('objectName','AI3-Pulse'),
('presentValue',100),
('units','Amp')]
}
def tuple_to_str(t):
# It can be implemeneted with more options
return str(t[0])+'_'+str(t[1])
def str_to_tuple(s):
l =s.split('_')
# Your first (second) item is int
l[1] = int(l[1])
return tuple(l)
if __name__=="__main__":
# create a space for a dict of data with string keys
s_data= dict()
for key in data:
s_data[tuple_to_str(key)] = data[key]
x = json.dumps(s_data)
# create a space to load the json with string keys
raw_data = json.loads(x)
final_data = dict()
for key in raw_data:
final_data[str_to_tuple(key)] = raw_data[key]
# Ture
print(final_data)发布于 2021-04-01 16:47:47
错误是明确的。在Python dict中,key可以是任何hashable类型,包括元组、冻结集或冻结dict (但既不是列表,也不是set或dict)。
但在Json对象中,字典键只能是字符串、数字(int或float)、布尔值或特殊对象None。
长话短说,您的输入字典不能直接转换为Json。
可能的解决方法:
,也可以使用自定义序列化格式。
ast.literal_evel将字符串转换回元组:js = json.dumps({str(k):v表示k,v in data.items()})
给予:{"('analogInput', 18)": [["objectName", "AI8-Voltage"], ["presentValue", 238.3], ["units", "Volts"]], "('analogInput', 3)": [["objectName", "AI3-Pulse"], ["presentValue", 100], ["units", "Amp"]]}
您可以使用以下命令重新加载它:
data2 = {ast.literal_eval(k):v for k,v in json.loads(js).items()}
给{('analogInput', 18): [['objectName', 'AI8-Voltage'], ['presentValue', 238.3], ['units', 'Volts']], ('analogInput', 3): [['objectName', 'AI3-Pulse'], ['presentValue', 100], ['units', 'Amp']]}
您可以看到json转换已经将元组更改为列表。
https://stackoverflow.com/questions/66900664
复制相似问题