首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Json对象中转换我的字典?

如何在Json对象中转换我的字典?
EN

Stack Overflow用户
提问于 2021-04-01 16:07:11
回答 2查看 67关注 0票数 1

我是Python的新手,我正在尝试用Json编码一个数据字典。

我的结论是:

代码语言:javascript
复制
data = { ('analogInput', 18) : [('objectName','AI8-Voltage'),
                                ('presentValue',238.3),
                                 ('units','Volts')],
         ('analogInput', 3)  : [('objectName','AI3-Pulse'),
                                ('presentValue',100),
                                ('units','Amp')]
        }

当我尝试这样做的时候: foo = json.dumps(data),我得到了这样的消息:致命错误:键必须是字符串、整数、浮点数、布尔值或无,而不是元组

我正在努力寻找答案,但我不知道在我的情况下该如何继续下去

谢谢你的回答

EN

回答 2

Stack Overflow用户

发布于 2021-04-01 16:38:53

首先,并不是所有类型都可以用于JSON键。

JSON键必须是字符串,值必须是有效的

数据类型(字符串、数字、对象、数组、布尔值或null)。

有关更多信息,请查看this

现在,作为可行的解决方案,我建议您实现两个函数,将元组转换为字符串,并将字符串转换为元组。下面提供了一个非常简单的示例:

代码语言:javascript
复制
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)
票数 0
EN

Stack Overflow用户

发布于 2021-04-01 16:47:47

错误是明确的。在Python dict中,key可以是任何hashable类型,包括元组、冻结集或冻结dict (但既不是列表,也不是set或dict)。

但在Json对象中,字典键只能是字符串、数字(int或float)、布尔值或特殊对象None。

长话短说,您的输入字典不能直接转换为Json。

可能的解决方法:

  • 使用不同的序列化工具。例如,pickle可以接受任何Python类型,但不能移植到非Python应用程序。但是,如果同时编写序列化和反序列化部分

,也可以使用自定义序列化格式。

  • 将密钥转换为字符串。在反序列化时,您只需使用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转换已经将元组更改为列表。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66900664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档