Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 修改对象中的JSON键/值对_Python_Json_Formatting - Fatal编程技术网

Python 修改对象中的JSON键/值对

Python 修改对象中的JSON键/值对,python,json,formatting,Python,Json,Formatting,我有一个JSON文件,它取自一个API调用 问题是“名称”“值实际上与另一个值“smb\u nt\u ms18\u jan\u 4056890”相关 名为“attribute_value”和“attribute_name”的键对我来说一文不值 我想将“name”作为键,“smb\u nt\u ms18\u jan\u 4056890”作为值。 在Python中有没有实现这一点的方法 JSON如下所示: { "attributes": [ { "attribute_valu

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

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

名为“attribute_value”和“attribute_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"
    }
],
}
ds = [
    {'attribute_value': 'smb_nt_ms18_jan_4056890', 'attribute_name': 'name'},
    {'attribute_value': 'MS18-4057142', 'attribute_name': 'msft'}
]

感谢您的建议和帮助。

不要将此视为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']}
def transform_attributes(ds):
    return [transform_attribute(d) for d in ds]

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

{
"attributes": [
    {
        "attribute_value": "smb_nt_ms18_jan_4056890",
        "attribute_name": "name"
    },
    {
        "attribute_value": "MS18-4057142",
        "attribute_name": "msft"
    }
],
}
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]
dds = {key: transform_attributes(ds) for key, ds in dds.items()}
再次,让我们做一个函数:

def transform_attribute(d):
    return {d['attribute_name']: d['attribute_value']}
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'}
    ]}
这只是一个字典理解:

ds = [transform_attribute(d) for d in ds]
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()}
或者也许这不是一本字典;也许您只想更改与
“属性”
关联的值?您的示例只有一个键/值,因此很难知道您想要哪个键/值。但如果有什么不同的话,那就更容易了:

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()}

是的,在Python中有一种方法可以做到这一点(通过编写代码)。第一步是反序列化JSON,最终得到一个Python对象图(dict/list/string,请参阅相应的文档)。然后,对这个对象图执行一个“有用”的转换,并将结果重新序列化回JSON。也许是一个例子。