Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中将复杂键(元组)存储到JSON中_Python_Json_Tuples_Complextype - Fatal编程技术网

在Python中将复杂键(元组)存储到JSON中

在Python中将复杂键(元组)存储到JSON中,python,json,tuples,complextype,Python,Json,Tuples,Complextype,我希望在JSON中存储具有复杂键(元组)的对象,例如: obj = {('a', '1', '', 'b') : '1'} 但使用: import json json.dumps(obj) 导致以下错误: TypeError: keys must be a string 将其转换为JSON并在以后取消粘贴的最快/最好的方法是什么 注意,它必须存储在典型的JSON数据库中(例如Cloudant/CouchDB/ElasticSearch) 此外,我认为在我的程序中使用元组是非常实用的,因此我

我希望在JSON中存储具有复杂键(元组)的对象,例如:

obj = {('a', '1', '', 'b') : '1'}
但使用:

import json
json.dumps(obj)
导致以下错误:

TypeError: keys must be a string
将其转换为JSON并在以后取消粘贴的最快/最好的方法是什么

注意,它必须存储在典型的JSON数据库中(例如Cloudant/CouchDB/ElasticSearch)


此外,我认为在我的程序中使用元组是非常实用的,因此我更愿意使用包含元组作为键的dict(在加载JSON之后)。

我认为有两种解决方法可以使用

  • 将数据存储为元组列表,而不是字典。请注意,在重新创建字典时,必须将不可破坏列表转换回元组

    >>> json.dumps(obj.items())
    '[[["a", "1", "", "b"], "1"]]'
    >>> {tuple(x): y for x, y in json.loads(_)}
    {(u'a', u'1', u'', u'b'): u'1'}
    
  • 将元组转换为字符串,然后在检索值时将这些字符串解析回元组

    >>> import ast
    >>> json.dumps({repr(x): y for x, y in obj.items()})
    '{"(\'a\', \'1\', \'\', \'b\')": "1"}'
    >>> {ast.literal_eval(x): y for x, y in json.loads(_).items()}
    {('a', '1', '', 'b'): u'1'}
    

  • 要么将元组转换为字符串表示,要么将dict转换为元组列表。@tobias_k
    tuple(str(('a','1','b'))
    str
    上的文档中的每个字符分隔开来):“与
    repr(object)
    的区别在于
    str(object)不总是试图返回一个可接受的代码,它的目标是返回一个可打印的字符串。“这意味着,如果您希望值可以接受<代码> EVA或更好的<代码> AST.MetralAlvia必须使用<代码> RePr>代码>而不是<代码> STR < /代码>。(repr(“1”)
    产生
    “1”
    但是
    ast.literal_-eval(str(“1”)
    产生
    1
    @DanD。同意应该使用
    repr
    ,但是对于元组,
    repr
    str
    都产生相同的输出。非常好,没有代码我真的不理解第一个例子。