json은 튜플을 키로 사용하여 사전을 직렬화합니다.
파이썬에서 튜플을 키로 사용하는 사전을 직렬화하는 방법이 있습니까?
a={(1,2):'a'}
단순히 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
당신은 그것을 json으로 직렬화 할 수 없으며, json은 파이썬보다 dict 키로 간주되는 것에 대해 훨씬 덜 유연한 생각을 가지고 있습니다.
매핑을 다음과 같은 일련의 키, 값 쌍으로 변환 할 수 있습니다.
>>> 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]}]'
JSON은 문자열 만 키로 지원합니다. 이러한 튜플을 문자열로 표현하는 방법을 선택해야합니다.
str((1,2))
json은 키를 문자열로만 기대하기 때문에 키로 사용할 수 있지만 이것을 사용 a[str((1,2))]
하면 값을 가져와야합니다.
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()}
참조 : https://stackoverflow.com/a/12337657/2455413
여기에 한 가지 방법이 있습니다. 기본 사전이 디코딩되고 전체 사전이 다시 시퀀싱 된 후 키가 json 디코딩되어야하지만 가능합니다.
import json
def jsonEncodeTupleKeyDict(data):
ndict = dict()
# creates new dictionary with the original tuple converted to json string
for key,value in data.iteritems():
nkey = json.dumps(key)
ndict[nkey] = value
# now encode the new dictionary and return that
return json.dumps(ndict)
def main():
tdict = dict()
for i in range(10):
key = (i,"data",5*i)
tdict[key] = i*i
try:
print json.dumps(tdict)
except TypeError,e:
print "JSON Encode Failed!",e
print jsonEncodeTupleKeyDict(tdict)
if __name__ == '__main__':
main()
나는이 방법의 효율성에 대해 어떠한 주장도하지 않습니다. 조이스틱 매핑 데이터를 파일에 저장하는 데 필요했습니다. 필자는 필요한 경우 편집 할 수 있도록 사람이 읽을 수있는 형식을 만드는 것을 사용하고 싶었습니다.
json은 문자열을 dict의 키로 만 받아 들일 수 있습니다. 당신이 할 수있는 일은 튜플 키를 문자열로 바꾸는 것입니다.
with open("file", "w") as f:
k = dic.keys()
v = dic.values()
k1 = [str(i) for i in k]
json.dump(json.dumps(dict(zip(*[k1,v]))),f)
읽을 때보 다 키를 다시 튜플로 변경할 수 있습니다.
with open("file", r) as f:
data = json.load(f)
dic = json.loads(data)
k = dic.keys()
v = dic.values()
k1 = [eval(i) for i in k]
return dict(zip(*[k1,v]))
참조 URL : https://stackoverflow.com/questions/7001606/json-serialize-a-dictionary-with-tuples-as-key
'programing' 카테고리의 다른 글
최고의 JavaScript 날짜 파서 및 포맷터? (0) | 2021.01.15 |
---|---|
자바에서 KDTree 구현 (0) | 2021.01.15 |
제공되지 않은 필수 매개 변수에 사용할 HTTP 상태 코드는 무엇입니까? (0) | 2021.01.15 |
React Native 앱을 브라우저에서 테스트 할 수 있습니까? (0) | 2021.01.15 |
Jackson과 Lombok이 함께 작동하도록 만들 수 없습니다. (0) | 2021.01.15 |