dicts的dict的JSON编码

2024-04-25 00:31:41 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个由原始dict组成的自定义数据结构。我需要使用JSON序列化这个。我的结构如下:

path_list_dict = {(node1, node2 .. nodeN): (float1, float2, float3)}

所以这是用一个元组键控的,这个值是一个由三个值组成的元组。键中的每个node元素都是一个自定义类对象,其中有一个为其编写的str方法。包装dict用一个键标识path_list_dict中的每个dict条目,如下所示:

^{pr2}$

等等。在

当我尝试使用JSON序列化它时,当然会遇到TypeError,因为内部dict将元组作为键和值,dict需要将键作为字符串进行序列化。通过在dict中插入str(tuple)表示而不仅仅是本机元组,可以很容易地解决这个问题。在

我关心的是,当我接收它并解包这些值时,我将在接收端拥有所有字符串。由自定义类元素组成的内部dict的键元组现在表示为str。我可以恢复嵌入的数据吗?或者这是其他更好的方法吗?在

为了更清楚,我使用这个JSON tutorial作为参考。在


Tags: path方法字符串json元素数据结构序列化结构
1条回答
网友
1楼 · 发布于 2024-04-25 00:31:41

您有几种选择:

  • 使用自定义密钥前缀序列化,您可以选择该前缀并再次取消序列化:

    tuple_key = '__tuple__({})'.format(','.join(key))
    

    将生成'__tuple__(node1,node2,nodeN)'作为键,您可以将其解析回另一端的元组:

    ^{pr2}$

    演示:

    >>> key = ('node1', 'node2', 'node3')
    >>> '__tuple__({})'.format(','.join(key))
    '__tuple__(node1,node2,node3)'
    >>> mapped_key = '__tuple__({})'.format(','.join(key))
    >>> tuple(mapped_key[10:-1].split(','))
    ('node1', 'node2', 'node3')
    
  • 不要使用字典,使用列表:

    {'Path': [[[node1, node2 .. nodeN], [float1, float2, float3]], [...]]}
    

    您可以简单地从dict.items()结果生成这样一个列表:

    >>> json.dumps({(1, 2, 3): ('foo', 'bar')}.items())
    '[[[1, 2, 3], ["foo", "bar"]]]'
    

    在解码时,将整个过程反馈给dict(),同时将每个键值列表映射到元组:

    >>> dict(map(tuple, kv) for kv in json.loads('[[[1, 2, 3], ["foo", "bar"]]]'))
    {(1, 2, 3): (u'foo', u'bar')}
    

后一种方法也更适合自定义类,因为^{} method仍将被交给这些自定义对象,以便您将其序列化回合适的dictionary对象,这意味着传递给^{}的合适的object_hook有机会再次为这些对象返回完全反序列化的自定义对象。在

相关问题 更多 >