在obj中修改JSON键/值对

2024-09-30 14:27:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个JSON文件,它来自一个API调用

问题是“名称”值实际上与另一个值“smb\u nt\u ms18\u jan\u 4056890”相关

名为“attribute\u value”和“attribute\u name”的键对我来说一文不值

我想把“name”作为键,把“smb\u nt\u ms18\u jan\u 4056890”作为值。 在Python中有这样做的方法吗

JSON如下所示:

{
"attributes": [
    {
        "attribute_value": "smb_nt_ms18_jan_4056890",
        "attribute_name": "name"
    },
    {
        "attribute_value": "MS18-4057142",
        "attribute_name": "msft"
    }
],
}

谢谢你的建议和帮助


Tags: 文件方法name名称apijsonvalueattribute
1条回答
网友
1楼 · 发布于 2024-09-30 14:27:54

不要认为这是JSON。一旦你解析了它,它就是一个字典,它唯一的价值就是一个字典列表。你想转换那些字典


首先,如何转换此词典:

d = {'attribute_value': 'smb_nt_ms18_jan_4056890', 'attribute_name': 'name'}

…变成这个:

{'name': 'smb_nt_ms18_jan_4056890'}

这很简单:

d = {d['attribute_name']: d['attribute_value']}

让我们用一个函数来总结:

def transform_attribute(d):
    return {d['attribute_name']: d['attribute_value']}

好的,现在如果你有一个这样的字典列表,像这样:

ds = [
    {'attribute_value': 'smb_nt_ms18_jan_4056890', 'attribute_name': 'name'},
    {'attribute_value': 'MS18-4057142', 'attribute_name': 'msft'}
]

…你如何改造他们?写一个清单:

ds = [transform_attribute(d) for d in ds]

再次,让我们做一个函数:

def transform_attributes(ds):
    return [transform_attribute(d) for d in ds]

好的,如果你有一个dict,它的值是这样的列表,你如何转换它:

dds = {
    "attributes": [
        {'attribute_value': 'smb_nt_ms18_jan_4056890', 'attribute_name': 'name'},
        {'attribute_value': 'MS18-4057142', 'attribute_name': 'msft'}
    ]}

这只是一个字典理解:

dds = {key: transform_attributes(ds) for key, ds in dds.items()}

你也可以把它包起来:

def transform_attributes_dict(dds):
    return {key: transform_attributes(value) for key, value in dds.items()}

或者它可能不是一个字典理解;也许您只想更改与'attributes'关联的值?你的例子只有一个键/值,所以很难知道你想要哪一个。但如果有什么不同的话,那就更简单了:

dds['attributes'] = transform_attributes(dds['attributes'])

如果您想在工作之后使它更加简洁,可以将函数内联到一个大表达式的中间。但如果你一直这么说,可能不太容易理解:

dds = {key: transform_attributes(value) for key, value in dds.items()}

dds = {key: [transform_attribute(d) for d in value] for key, value in dds.items()}

dds = {key: [{d['attribute_name']: d['attribute_value']} for d in value]
       for key, value in dds.items()}

相关问题 更多 >