将JSON元素转换为数组

2024-05-13 19:52:45 发布

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

我是Python新手,已经有一段时间没有编写代码了。有没有办法将JSON结构中的元素转换为数组?你知道吗

示例

给出:

{
    "persons": 
        {
            "city": "Seattle", 
            "name": "Brian"
        }
}

要求:

{
    "persons": [
        {
            "city": "Seattle", 
            "name": "Brian"
        }
    ]
}

背景: 我想使用重复记录将JSON插入到一个大查询表中。 但这些字段不需要重复,只是在某些情况下会发生。一旦我有了一个数组,一切正常,如果数组丢失,就会返回一个错误。 现在我正在寻找一些python函数,在这里我可以说makemypersons元素是一个包含一个元素的数组。你知道吗

致以最诚挚的问候

编辑:

更具体一点: 我的结构如下。你知道吗

{
"a" : {
    "b" : [
        {
            "c" : {
                "foo" : "bar",
                ...
            },
            "d" : {
                "foo" : "bar",
                ...
            },
            "e" : "bar"
        },
        {
            "c" : [
                {
                    "foo" : "bar",
                    ...
                },
                {
                    "foo" : "bar",
                    ...
                },
                {
                    "foo" : "bar",
                    ...
                },
                {
                    "foo" : "bar",
                    ...
                },
                {
                    "foo" : "bar",
                    ...
                }
            ],
            "d" : {
                "foo" : "bar",
                    ...
            },
            "e" : "bar"
        },
        {
            "c" : {
                "foo" : "bar",
                ...
            },
            "d" : {
                "foo" : "bar",
                ...
            },
            "e" : "bar"
        }
    ]
},
"f" : {
    "foo" : "bar",
    ....
}

}

b和c可以重复,但不必重复。无论如何,我需要两个元素作为一个数组。最好的方法是使用JSON、b和c作为输入的可重用函数,因为我们有不同结构的JSON文件。你知道吗

目前我尝试使用@ajrwhite方法来实现我的要求,但我有点吃力。你知道吗


Tags: 方法函数代码namejson元素cityfoo
2条回答

您可以将特定元素更改为列表并重新指定:

j_data = {
    "persons":
        {
            "city": "Seattle",
            "name": "Brian"
        }
}

j_data['persons'] = [j_data['persons']]
print(j_data)

输出

{'persons': [{'city': 'Seattle', 'name': 'Brian'}]}

使用indent参数进行漂亮打印

j_data = {
    "persons":
        {
            "city": "Seattle",
            "name": "Brian"
        }
}

j_data['persons'] = [j_data['persons']]
import json
print(json.dumps(j_data, indent=4, sort_keys=True))

输出

{
    "persons": [
        {
            "city": "Seattle",
            "name": "Brian"
        }
    ]
}

编辑:

如果要将所有元素转换为列表,可以使用一个简单的循环:

j_data = {
    "persons":
        {
            "city": "Seattle",
            "name": "Brian"
        },
    "cars":
        {
            "car1": "Tesla",
            "car2": "Toyota"
        }
}

for elem in j_data:
    j_data[elem] = [j_data[elem]]
# print(j_data)
import json
print(json.dumps(j_data, indent=4, sort_keys=True))

输出

{      
    "persons": [
        {
            "city": "Seattle",
            "name": "Brian"
        }
    ],
     "cars": [
        {
            "car1": "Tesla",
            "car2": "Toyota"
        }
    ]
}

在Python中使用深度嵌套的JSON样式结构(例如MongoDB提取)时,这是一个常见的问题。你知道吗

下面是一种递归方法,它将包含在[]中的一个大dict中的所有dicts

def listify_dict(var):
    if isinstance(var, dict):
        output_dict = var.copy()
        for k, v in var.items():
            output_dict[k] = listify_dict(v)
        return [output_dict]
    elif isinstance(var, list):
        output_list = var.copy()
        for i, v in enumerate(output_list):
            output_list[i] = listify_dict(v)
        return output_list
    else:
        return var

示例:

test = {
    "persons": 
        {
            "city": "Seattle", 
            "name": "Brian"
        }
}
listify_dict(test)

输出:

[{'persons': [{'city': 'Seattle', 'name': 'Brian'}]}]

相关问题 更多 >