Python 重新格式化现有json文件
我有下一个json文件:Python 重新格式化现有json文件,python,json,Python,Json,我有下一个json文件: { "data": [ { "{#SQP}": "/usr/local/squid/bin/squid", "{#SQP_ID}": "squid1", "{#SQP_ARG}": "-D -C -F -f /etc/squid1.conf", "{#SQP_PT}": "1111", "{#SQP_CONFIG}": "/etc/squid1.conf" }, { "{#SQP}": "/usr/local/squid/bin/squid", "{#SQ
{ "data": [ { "{#SQP}": "/usr/local/squid/bin/squid", "{#SQP_ID}": "squid1", "{#SQP_ARG}": "-D -C -F -f /etc/squid1.conf", "{#SQP_PT}": "1111", "{#SQP_CONFIG}": "/etc/squid1.conf" }, { "{#SQP}": "/usr/local/squid/bin/squid", "{#SQP_ID}": "squid2", "{#SQP_ARG}": "-D -C -F -f /etc/squid2.conf", "{#SQP_PT}": "2222 3333", "{#SQP_CONFIG}": "/etc/squid2.conf" }, { "{#SQP}": "/usr/local/squid/bin/squid", "{#SQP_ID}": "squid3", "{#SQP_ARG}": "-D -C -F -f /etc/squid3.conf", "{#SQP_PT}": "4444", "{#SQP_CONFIG}": "/etc/squid3.conf" } ]}
python脚本正在读取此文件:
#!/usr/bin/env python
import json
import re
import sys
import unittest
import StringIO
def loadSquidPorts(discoveryJson, spJson):
jsn = json.load(discoveryJson)
for dt in jsn['data']:
try:
id = dt['{#SQP_ID}']
port = dt['{#SQP_PT}']
spJson['data'].append({'{ID}': id, '{#PORT}': port})
except Exception as err:
pass
def printSquidPortDiscovery(discFilespec, dumpDest=sys.stdout):
portJson = {'data': []}
try:
with open(discFilespec) as discJson:
loadSquidPorts(discJson, portJson)
except:
pass
json.dump(portJson, dumpDest)
if __name__ == '__main__':
printSquidPortDiscovery('/root/file.json')
python脚本的输出如下:
{
"data": [
{
"{#ID}": "squid1",
"{#PORT}": "1111"
},
{
"{#ID}": "squid2",
"{#PORT}": "2222 3333"
},
{
"{#ID}": "squid3",
"{#PORT}": "4444"
}
]
}
我需要在多个端口值的情况下使用此python脚本-分别打印它们,例如:
{
"data": [
{
"{#ID}": "squid1",
"{#PORT}": "1111"
},
{
"{#ID}": "squid2",
"{#PORT}": "2222",
"{#PORT}": "3333"
},
{
"{#ID}": "squid3",
"{#PORT}": "4444"
}
]
}
你能帮我一下吗?请不要用这句话:
spJson['data'].append({'{ID}': id, '{#PORT}': port})
使用:
这将为您提供端口ID作为列表:
{
"{#ID}": "squid1",
"{#PORTS}": [
"555",
"777"
]
}
如果不需要列表,请尝试使用带有编号后缀的键:
port_data = dict()
port_data['{#ID}'] = id
i=0
for single_port in port.split(" "):
port_data["{#PORT-" + str(i) + "}"] = single_port
i=i+1
spJson['data'].append(port_data)
这种情况下的输出:
{
"{#ID}": "squid6",
"{#PORT-0}": "555",
"{#PORT-1}": "777"
}
对不起,有个打字错误。已编辑。无法执行此操作,因为您需要具有唯一键。为什么要执行此操作?如果你愿意的话,可以以后再做。但这样做的意义何在?如果没有预处理,您将无法在以后将其转换为json。对于端口
值
,理想情况下它应该是一个列表作为“{#port}”的值,我需要它在Zabbix中进行低级别发现。如果我使用一个端口列表,那么将只收集其中一个端口的指标。因此,我需要以某种方式分离端口,以便将它们分别添加到项中:2222用于项1等,而不是2222 3333用于一个项。
{
"{#ID}": "squid6",
"{#PORT-0}": "555",
"{#PORT-1}": "777"
}