用于dicts的dict的JSON编码

时间:2014-01-28 21:45:16

标签: python json serialization python-3.x

让我们说我有一个包含原始dicts的自定义数据结构。我需要使用JSON序列化它。我的结构如下:

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

所以这是一个元组的键,值是三个值的元组。 键中的每个节点元素都是一个自定义类对象,其中为_ str _方法编写了。使用密钥标识path_list_dict中每个dict条目的包装器dict如下:

path_options_dict = {‘Path1’: {(node1, node2 .. nodeN): (float1, float2, float3)}, ‘Path2’: {(nodeA1, nodeA2 .. nodeAN): (floatA1, floatA2, floatA3)} }

等等。

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

我关心的是,当我收到它并解压缩值时,我将在接收端拥有所有字符串。由自定义类元素组成的内部字典的关键元组现在表示为str。我能恢复嵌入数据吗?或者这些是其他方式更好地做到这一点?

为了更加清晰,我使用此JSON tutorial作为参考。

1 个答案:

答案 0 :(得分:1)

您有几种选择:

  • 使用您可以选择并重新反序列化的自定义键前缀进行序列化:

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

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

    if key.startswith('__tuple__('):
         key = tuple(key[10:-1].split(','))
    

    演示:

    >>> 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')}
    

后一种方法也更适合自定义类,因为JSONEncoder.default() method仍将被传递给这些自定义对象,以便序列化回合适的字典对象,这意味着合适的{{1}传递给JSONDecoder()的机会再次为那些人返回完全反序列化的自定义对象。