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"}
求教。我需要用相同的键创建一个 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 我不明白是什么让你
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"}