从元组列表创建json的python

时间:2018-01-31 10:19:15

标签: python json python-3.x zabbix

我问建议。我需要使用相同的键创建一个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)

但我无法理解如何更好地做到这一点,以免拐杖,可能已经有一个现成的解决方案,但花了一些时间我找不到合适的东西。感谢您的任何建议

3 个答案:

答案 0 :(得分:1)

JSON是否有效?

是的,{"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"}

字典不能具有相同的键,但所有值都可以相同。