我问建议。我需要使用相同的键创建一个JSON对象。这对于向host.create发送zabbix请求是必要的。 https://www.zabbix.com/documentation/3.0/ru/manual/api/reference/host/create 如果指定多个组,则仅接受
{"groupid": "2", "groupid": "8"}
不明白:
{"groupid": ["2","8"]}
我想使用一种结构。
[("groupid","2"),("groupid","8")]
我用这种方式解决了问题,但我不明白如何转换为JSON,因为键不是字符串
import json
from json import JSONEncoder
class SameKeys(JSONEncoder):
def __init__(self, name):
self.name = name
def __repr__(self):
return json.dumps(self.name)
data = [("groupid", "2"), ("groupid", "8")]
a = {SameKeys("groupid"): "2", SameKeys("groupid"): "8"}
print(a)
但我无法理解如何更好地做到这一点,以免拐杖,可能已经有一个现成的解决方案,但花了一些时间我找不到合适的东西。感谢您的任何建议
答案 0 :(得分:1)
是的,{"groupid": "2", "groupid": "8"}
是有效的JSON,我不明白是什么让你think otherwise。 RFC8259 says
对象中的名称 SHOULD是唯一的
因为如果他们不是那么
接收此类对象的软件的行为是不可预测的
但这不是强制性的。
我读了您链接的docs,但我没有发现任何暗示您需要一个名为“groupid”的成员的对象。在该示例中,有一个对象具有成员“groups”,其值为数组:
{
...
"params": {
...
"groups": [
{
"groupid": "50"
}
],
...
},
...
}
我认为,为了将主机添加到多个组,您需要包含阵列中的所有组。
{
...
"params": {
...
"groups": [
{
"groupid": "2"
},
{
"groupid": "8"
}
],
...
},
...
}
不幸的是我没有机会测试它。
无论如何,您似乎想要转换像
这样的项目列表data = [("groupid","2"),("groupid","8")]
进入具有相应成员的JSON对象。好吧,JSON对象只是文本,你所要做的就是在迭代项目时构建字符串。
obj = '{' + ', '.join('"{}": "{}"'.format(k, v) for k, v in data) + '}'
print(obj)
将打印
{"groupid": "2", "groupid": "8"}
答案 1 :(得分:0)
您可以使用defaultdict
作为数据的中间结构:
import json
from collections import defaultdict
src=[("groupid", "2"), ("groupid", "8")]
dst = defaultdict(list)
for k,v in src:
dst[k].append(v)
print(dst)
print(json.dumps(dst))
输出:
defaultdict(<class 'list'>, {'groupid': ['2', '8']})
{"groupid": ["2", "8"]}
现在您可以转移json
&lt; - &gt; defaultdict
,您还可以翻译defaultdict
&lt; - &gt; other
,其他可能适合您当前的申请。
答案 2 :(得分:0)
假设ID值不能相同,为什么不反转字典。 E.g。
a = {"2": "groupid", "8": "groupid"}
字典不能具有相同的键,但所有值都可以相同。