Python JSON不可哈希类型'list'问题

4

我有一段代码,它向服务器提交JSON数据,但是出现了“unhashable type list”错误。

hcatalog_nodes =["idh30-1.srv.acent.net.uk","idh30-2.srv.acent.net.uk","idh30-3.srv.acent.net.uk"]
for node in hcatalog_nodes:
    data = json.dumps({[
                            {
                                "rolename": "HCatalog",
                                "hostname": node
                            }

                        ]})
    request = urllib2.Request("https://192.168.0.76:9443/restapi/acent/api/v2/cluster/"+cluster_name+"/services/hbase/roles")
    base64string = base64.encodestring('%s:%s' % ("admin", "admin")).replace('\n', '')
    request.add_header("Authorization", "Basic %s" % base64string)
    print "setting up HBase roles on node %s " % (node)
    result = urllib2.urlopen(request,data)
    print result.read()

错误:

Traceback (most recent call last):
  File "/home/kshk/PycharmProjects/intelIDH/autoIDH.py", line 287, in <module>
    main()
  File "/home/kshk/PycharmProjects/intelIDH/autoIDH.py", line 278, in main
    add_hcatalogRoles()
  File "/home/kshk/PycharmProjects/intelIDH/autoIDH.py", line 147, in add_hcatalogRoles
    "hostname": node
TypeError: unhashable type: 'list'

Process finished with exit code 1

你有什么想法可以在JSON请求中设置"node"的值吗?


你的问题不在于JSON序列化,而是在于定义一个有效的Python数据结构。你试图转储{[... - 这是一个集合,其中一个元素是列表。集合元素只能是可哈希类型。列表是不可哈希的,因此会出现错误。 - Lukas Graf
@LukasGraf:我认为你在写“dictionary”和“key”的地方应该是“set”和“element”。 - DSM
@DSM 错了,你显然是正确的。 - Lukas Graf
1个回答

7
问题出在json.dumps()这行代码上:
data = json.dumps({[{"rolename": "HCatalog", "hostname": node}]})

这个操作基本上是试图创建一个只有一个列表元素的集合。Python 列表不能成为集合的元素。


你可能想要创建一个字典,然后将其传递给 json.dumps()

data = json.dumps({"rolename": "HCatalog", "hostname": node})

好的,我如何设置节点的值? - krisdigitx
你只是多了一组花括号,它代表一个集合字面量,而这个集合不能包含列表。请移除最外层的花括号。 - Ben
1
那给了我另一个错误:“不可哈希类型:字典” - krisdigitx
使用alexce发布的内容。 - Ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接