python 从元组列表创建 json

python from list of tuple create json

求教。我需要用相同的键创建一个 JSON 对象。这是向 zabbix 发送 host.create 请求所必需的。 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,因为key不是字符串

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)

但是我不明白怎样才能更好地做到不拐杖,可能已经有现成的解决方案,但是花了一段时间我没有找到合适的。感谢您的任何建议

您可以使用 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 <-> defaultdict,您还可以翻译 defaultdict <-> other,其他可能适合您当前的应用。

假设ID值不能相同,为什么不反转字典。例如

a = {"2": "groupid", "8": "groupid"}

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

是否有效JSON?

是的,{"groupid": "2", "groupid": "8"} 是有效的 JSON 我不明白是什么让你 . RFC8259 says

the names within an object SHOULD be unique

因为如果他们不是那么

the behavior of software that receives such an object is unpredictable

但这不是强制性的。

你需要吗?

我阅读了您链接的 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"}