【问题标题】:python from list of tuple create jsonpython从元组列表中创建json
【发布时间】:2018-01-31 10:19:14
【问题描述】:

我征求意见。我需要创建一个具有相同键的 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,因为键不是字符串

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)

但我不明白如何做得更好以免拐杖,可能已经有现成的解决方案,但花了时间我没有找到合适的东西。谢谢你的建议

【问题讨论】:

  • {"groupid": "2", "groupid": "8"} 不是有效的 python dict
  • 这是不可能的。相同的键 = 不是字典
  • @VivekKalyanarangan 它是有效的,但它只保留最后一项
  • 你可以试试两个字典的列表。

标签: python json python-3.x zabbix


【解决方案1】:

它是有效的 JSON 吗?

是的,{"groupid": "2", "groupid": "8"} 是有效的 JSON,我不明白是什么让你成为了 think otherwise。 RFC8259says

对象中的名称 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"}

【讨论】:

  • 下午好。非常感谢您的回复。我只是想并且已经做到了。事实上,Zabbix 接受查询,所以 {"groupid": "2", "groupid": "8"} 和 {"groupid": "2"},{ "groupid": "8"}。这很奇怪,也让我感到困惑,因为大学说到底需要什么,这就是他们一生的方式{“groupid”:“2”,“groupid”:“8”}。
【解决方案2】:

您可以使用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,其他可能适合您当前的应用程序。

【讨论】:

  • 感谢您的回答。但我不太适合这个。我编辑了这个问题,因为我没有把它说清楚。我需要完全相同的 json 键
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 2011-11-10
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多