繁体   English   中英

如何使用python将多个相同的键格式化为JSON?

[英]How do I format JSON's with multiple of the same keys with python?

我有一个程序,现在使用powershell脚本和WMI来获取温度和负载等数据。 它将数据输出为JSON文件。 现在让我先说这是我第一次使用JSON并且我对JSON python库不太熟悉。 这是我的程序的代码:

import subprocess
import json

p = subprocess.Popen(["C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\powershell.exe", ". \"./TestScript\";", "&NSV"], stdout=subprocess.PIPE)
(output, err) = p.communicate()

data = json.loads(output)

for mNull in data:
    del mNull['Scope']
    del mNull['Path']
    del mNull['Options']
    del mNull['ClassPath']
    del mNull['Properties']
    del mNull['SystemProperties']
    del mNull['Qualifiers']
    del mNull['Site']
    del mNull['Container']
    del mNull['PSComputerName']
    del mNull['__GENUS']
    del mNull['__CLASS']
    del mNull['__SUPERCLASS']
    del mNull['__DYNASTY']
    del mNull['__RELPATH']
    del mNull['__PROPERTY_COUNT']
    del mNull['__DERIVATION']
    del mNull['__SERVER']
    del mNull['__NAMESPACE']
    del mNull['__PATH']

fdata = json.dumps(data,indent=2)

print(fdata)

现在这里是生成的JSON:

[
  {
    "Name": "Memory",
    "SensorType": "Load",
    "Value": 53.3276978
  },
  {
    "Name": "CPU Core #2",
    "SensorType": "Temperature",
    "Value": 69
  },
  {
    "Name": "Used Space",
    "SensorType": "Load",
    "Value": 93.12801
  },
  {
    "Name": "CPU Core #1",
    "SensorType": "Temperature",
    "Value": 66
  },
  {
    "Name": "CPU DRAM",
    "SensorType": "Power",
    "Value": 1.05141532
  },
  {
    "Name": "CPU Core #2",
    "SensorType": "Load",
    "Value": 60.15625
  },
  {
    "Name": "CPU Package",
    "SensorType": "Power",
    "Value": 15.2162886
  },
  {
    "Name": "Bus Speed",
    "SensorType": "Clock",
    "Value": 100.000031
  },
  {
    "Name": "CPU Total",
    "SensorType": "Load",
    "Value": 57.421875
  },
  {
    "Name": "CPU Package",
    "SensorType": "Temperature",
    "Value": 69
  },
  {
    "Name": "CPU Core #2",
    "SensorType": "Clock",
    "Value": 2700.00073
  },
  {
    "Name": "Temperature",
    "SensorType": "Temperature",
    "Value": 41
  },
  {
    "Name": "Used Memory",
    "SensorType": "Data",
    "Value": 4.215393
  },
  {
    "Name": "Available Memory",
    "SensorType": "Data",
    "Value": 3.68930435
  },
  {
    "Name": "CPU Core #1",
    "SensorType": "Clock",
    "Value": 3100.001
  },
  {
    "Name": "CPU Cores",
    "SensorType": "Power",
    "Value": 13.3746643
  },
  {
    "Name": "CPU Graphics",
    "SensorType": "Power",
    "Value": 0.119861834
  },
  {
    "Name": "CPU Core #1",
    "SensorType": "Load",
    "Value": 54.6875
  }
]

如您所见,列表中的每个字典都有NameSensorTypeValue

我想要做的是使每个列表的“标签”等于每个列表中的Name ,因此我可以一次调用一个特定条目的数据。 再一次,我是JSON及其库的新手,所以我甚至不确定这种事情是否可行。 任何帮助将不胜感激! 祝你有美好的一天! :)

编辑1:这是一个例子,使用前两个,我希望程序能够输出。

[
  "Memory":{
    "SensorType": "Load",
    "Value": 53.3276978
  },
  "CPU Core #2":{
    "SensorType": "Temperature",
    "Value": 69
  }
]

再一次,我甚至不知道这是否是有效的JSON,但我希望它只是做一些至少类似的事情,所以我可以调用,例如, print(data["Memory"]["Value"])并返回, 53.3276978

编辑2:我确实发现有一些具有多种传感器类型的名称,例如, "CPU Core #1""CPU Core #2"都具有"Tempurature""Load""Clock" 使用上面的例子可能会导致一些冲突,那么有什么方法可以解释这个问题?

假设您需要保留值,如果密钥已存在:

import json
data = [
{
    "Name": "Memory",
    "SensorType": "Load",
    "Value": 53.3276978
},
{
    "Name": "CPU Core #2",
    "SensorType": "Temperature",
    "Value": 69
},
{
    "Name": "Used Space",
    "SensorType": "Load",
    "Value": 93.12801
},
{
    "Name": "CPU Core #1",
    "SensorType": "Temperature",
    "Value": 66
},
{
    "Name": "CPU DRAM",
    "SensorType": "Power",
    "Value": 1.05141532
},
{
    "Name": "CPU Core #2",
    "SensorType": "Load",
    "Value": 60.15625
},
{
    "Name": "CPU Package",
    "SensorType": "Power",
    "Value": 15.2162886
},
{
    "Name": "Bus Speed",
    "SensorType": "Clock",
    "Value": 100.000031
},
{
    "Name": "CPU Total",
    "SensorType": "Load",
    "Value": 57.421875
},
{
    "Name": "CPU Package",
    "SensorType": "Temperature",
    "Value": 69
},
{
    "Name": "CPU Core #2",
    "SensorType": "Clock",
    "Value": 2700.00073
},
{
    "Name": "Temperature",
    "SensorType": "Temperature",
    "Value": 41
},
{
    "Name": "Used Memory",
    "SensorType": "Data",
    "Value": 4.215393
},
{
    "Name": "Available Memory",
    "SensorType": "Data",
    "Value": 3.68930435
},
{
    "Name": "CPU Core #1",
    "SensorType": "Clock",
    "Value": 3100.001
},
{
    "Name": "CPU Cores",
    "SensorType": "Power",
    "Value": 13.3746643
},
{
    "Name": "CPU Graphics",
    "SensorType": "Power",
    "Value": 0.119861834
},
{
    "Name": "CPU Core #1",
    "SensorType": "Load",
    "Value": 54.6875
}
]

final_data = {}

for d in data:
    if d['Name'] not in final_data:
        final_data[d['Name']] = list()

    key = d.pop('Name')
    final_data[key].append(temp)


print json.dumps(final_data,indent=4)

会给你

{
"CPU Package": [
    {
        "SensorType": "Power",
        "Value": 15.2162886
    },
    {
        "SensorType": "Temperature",
        "Value": 69
    }
],
"Temperature": [
    {
        "SensorType": "Temperature",
        "Value": 41
    }
],
"CPU Core #2": [
    {
        "SensorType": "Temperature",
        "Value": 69
    },
    {
        "SensorType": "Load",
        "Value": 60.15625
    },
    {
        "SensorType": "Clock",
        "Value": 2700.00073
    }
],
"CPU Core #1": [
    {
        "SensorType": "Temperature",
        "Value": 66
    },
    {
        "SensorType": "Clock",
        "Value": 3100.001
    },
    {
        "SensorType": "Load",
        "Value": 54.6875
    }
],
"CPU Cores": [
    {
        "SensorType": "Power",
        "Value": 13.3746643
    }
],
"Available Memory": [
    {
        "SensorType": "Data",
        "Value": 3.68930435
    }
],
"Used Space": [
    {
        "SensorType": "Load",
        "Value": 93.12801
    }
],
"Bus Speed": [
    {
        "SensorType": "Clock",
        "Value": 100.000031
    }
],
"Memory": [
    {
        "SensorType": "Load",
        "Value": 53.3276978
    }
],
"Used Memory": [
    {
        "SensorType": "Data",
        "Value": 4.215393
    }
],
"CPU Total": [
    {
        "SensorType": "Load",
        "Value": 57.421875
    }
],
"CPU DRAM": [
    {
        "SensorType": "Power",
        "Value": 1.05141532
    }
],
"CPU Graphics": [
    {
        "SensorType": "Power",
        "Value": 0.119861834
    }
]
}

希望这可以帮助

你可以像这样建立一个你想要的形状的新字典:

...
data = {
    element["Name"]: {
        key: value for key, value in element.items() if key != "Name"
    }
    for element in json.loads(output)
}
fdata = json.dumps(data, indent=4)
...

结果:

{
    "Memory": {
        "SensorType": "Load",
        "Value": 53.3276978
    },
    "CPU Core #2": {
        "SensorType": "Clock",
        "Value": 2700.00073
    },
    (and so on)
}
x="""[
  {
    "Name": "Memory 1",
    "SensorType": "Load",
    "Value": 53.3276978
  },
  {
    "Name": "CPU Core #2",
    "SensorType": "Load",
    "Value": 53.3276978
  }]"""

json_obj=json.loads(x)

new_list=[]
for item in json_obj:
    name=item.pop('Name')
    new_list.append({name:item})

print(json.dumps(new_list,indent=4))

产量

[
{
    "Memory 1": {
        "SensorType": "Load", 
        "Value": 53.3276978
    }
}, 
{
    "CPU Core #2": {
        "SensorType": "Load", 
        "Value": 53.3276978
    }
}
]

这个怎么样?

import json
orig_list = json.load(<filename>)
new_dict = { l['Name']:{k:v for k,v in l.items() if k!='Name'} for l in orig_list}
json.dumps(new_dict, <filename>)

这样,您就不必从文件中加载的dict del项目。

你可以替换

for mNull in data:
    del mNull['Scope']
    del mNull['Path']
    del mNull['Options']
    del mNull['ClassPath']
    del mNull['Properties']
    del mNull['SystemProperties']
    del mNull['Qualifiers']
    del mNull['Site']
    del mNull['Container']
    del mNull['PSComputerName']
    del mNull['__GENUS']
    del mNull['__CLASS']
    del mNull['__SUPERCLASS']
    del mNull['__DYNASTY']
    del mNull['__RELPATH']
    del mNull['__PROPERTY_COUNT']
    del mNull['__DERIVATION']
    del mNull['__SERVER']
    del mNull['__NAMESPACE']
    del mNull['__PATH']

fdata = json.dumps(data,indent=2)

dontwant=set(['Name', 'PSComputerName', '__RELPATH', '__DYNASTY', '__CLASS', '__PROPERTY_COUNT', 'Site', 'ClassPath', 'SystemProperties', 'Scope', 'Qualifiers', 'Options', '__NAMESPACE', 'Path', '__SUPERCLASS', '__DERIVATION', '__GENUS', '__PATH', 'Container', 'Properties', '__SERVER']) # set of keys to drop
out={} # empty dict
for mNull in data:
    name=mNull['Name']
    out[name]={key:value for key,value in mNull.items() if key not in dontwant} # only copy over items you want

fdata = json.dumps(out,indent=2)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM