json serialize a dictionary with tuples as key

前端 未结 6 1760
走了就别回头了
走了就别回头了 2020-12-05 09:27

Is there a way in Python to serialize a dictionary that is using a tuple as key:

a={(1,2):\'a\'}

simply using json.dumps(a), produces:

相关标签:
6条回答
  • 2020-12-05 09:47

    json can only accept strings as keys for dict, what you can do, is to replace the tuple keys with string like so

    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) 
    

    And than when you want to read it, you can change the keys back to tuples using

    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])) 
    
    0 讨论(0)
  • 2020-12-05 09:53
    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()}
    

    See: https://stackoverflow.com/a/12337657/2455413

    0 讨论(0)
  • 2020-12-05 09:56

    Here is one way to do it. It will require the key to be json decoded after the main dictionary is decoded and the whole dictionary re-sequenced, but it is doable:

        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()
    

    I make no claim to any efficiency of this method. I needed this for saving some joystick mapping data to a file. I wanted to use something that would create a semi-human readable format so it could be edited if needed.

    0 讨论(0)
  • 2020-12-05 10:01

    You could just use str((1,2)) as key because json only expects the keys as strings but if you use this you'll have to use a[str((1,2))] to get the value.

    0 讨论(0)
  • 2020-12-05 10:02

    JSON only supports strings as keys. You'll need to choose a way to represent those tuples as strings.

    0 讨论(0)
  • 2020-12-05 10:05

    You can't serialize that as json, json has a much less flexible idea about what counts as a dict key than python.

    You could transform the mapping into a sequence of key, value pairs, something like this:

    >>> 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]}]'
    
    0 讨论(0)
提交回复
热议问题