首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在python中使用多个相同的键来格式化JSON?

如何在python中使用多个相同的键来格式化JSON?
EN

Stack Overflow用户
提问于 2018-08-08 03:00:00
回答 5查看 789关注 0票数 1

我有一个程序,现在捕获数据,如温度和加载使用powershell脚本和WMI。它将数据输出为JSON文件。现在,让我先说一下,这是我第一次使用JSON,我对JSON python库不是很熟悉。下面是我的程序的代码:

代码语言:javascript
复制
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:

代码语言:javascript
复制
[
  {
    "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:这是一个例子,使用第一个2,我希望程序能够输出什么。

代码语言:javascript
复制
[
  "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"。使用上面的例子可能会导致一些冲突,那么我们有没有办法解决这个问题呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-08-08 04:23:39

假设您需要在key已经存在的情况下保留这些值:

代码语言:javascript
复制
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)

会给你带来

代码语言:javascript
复制
{
"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
    }
]
}

希望这能有所帮助

票数 2
EN

Stack Overflow用户

发布于 2018-08-08 04:11:46

您可以按照您想要的形状构建一个新字典,如下所示:

代码语言:javascript
复制
...
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)
...

结果:

代码语言:javascript
复制
{
    "Memory": {
        "SensorType": "Load",
        "Value": 53.3276978
    },
    "CPU Core #2": {
        "SensorType": "Clock",
        "Value": 2700.00073
    },
    (and so on)
}
票数 1
EN

Stack Overflow用户

发布于 2018-08-08 04:14:43

代码语言:javascript
复制
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))

输出

代码语言:javascript
复制
[
{
    "Memory 1": {
        "SensorType": "Load", 
        "Value": 53.3276978
    }
}, 
{
    "CPU Core #2": {
        "SensorType": "Load", 
        "Value": 53.3276978
    }
}
]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51733698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档