有没有办法在Python中序列化使用元组作为键的字典:
a={(1,2):'a'}
Run Code Online (Sandbox Code Playgroud)
简单地使用json.dumps(a),产生:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/json/__init__.py", line 230, in dumps
return _default_encoder.encode(obj)
File "/usr/lib/python2.6/json/encoder.py", line 367, in encode
chunks = list(self.iterencode(o))
File "/usr/lib/python2.6/json/encoder.py", line 309, in _iterencode
for chunk in self._iterencode_dict(o, markers):
File "/usr/lib/python2.6/json/encoder.py", line 268, in _iterencode_dict
raise TypeError("key {0!r} is not a string".format(key))
TypeError: key (1, 2) is not a string
Run Code Online (Sandbox Code Playgroud)
Sin*_*ion 31
你不能把它序列化为json,json对于什么算作dict键而不是python有一个不那么灵活的想法.
您可以将映射转换为一系列键值对,如下所示:
>>> import json
>>> def remap_keys(mapping):
... return [{'key':k, 'value': v} for k, v in mapping.iteritems()]
...
>>> json.dumps(remap_keys({(1, 2): 'foo'}))
'[{"value": "foo", "key": [1, 2]}]'
Run Code Online (Sandbox Code Playgroud)
from json import load, dump
from ast import literal_eval
x={ (0,1):'la-la la', (0,2):'extricate' }
# save: convert each tuple key to a string before saving as json object
with open('/tmp/test', 'w') as f: dump({str(k):v for k, v in x.items()}, f)
# load in two stages:#
# (i) load json object
with open('/tmp/test', 'r') as f: obj = load(f)
# (ii) convert loaded keys from string back to tuple
d={literal_eval(k):v for k, v in obj.items()}
Run Code Online (Sandbox Code Playgroud)
参见:https : //stackoverflow.com/a/12337657/2455413
这个解决方案:
eval()。\",这比这里的其他str()/eval()方法更糟糕。def json_dumps_tuple_keys(mapping):
string_keys = {json.dumps(k): v for k, v in mapping.items()}
return json.dumps(string_keys)
def json_loads_tuple_keys(string):
mapping = json.loads(string)
return {tuple(json.loads(k)): v for k, v in mapping.items()}
m = {(0,"a"): "first", (1, "b"): [9, 8, 7]}
print(m) # {(0, 'a'): 'first', (1, 'b'): [9, 8, 7]}
s = json_dumps_tuple_keys(m)
print(s) # {"[0, \"a\"]": "first", "[1, \"b\"]": [9, 8, 7]}
m2 = json_loads_tuple_keys(s)
print(m2) # {(0, 'a'): 'first', (1, 'b'): [9, 8, 7]}
print(m==m2) # True
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20516 次 |
| 最近记录: |