让我们说我有一个包含原始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作为参考。
答案 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()
的机会再次为那些人返回完全反序列化的自定义对象。