将 JSON 个元素转换为数组
Convert JSON element to array
我是 Python 的新手,已经有一段时间没有编码了。有没有办法将 JSON 结构中的元素转换为数组?
例子
鉴于:
{
"persons":
{
"city": "Seattle",
"name": "Brian"
}
}
必填:
{
"persons": [
{
"city": "Seattle",
"name": "Brian"
}
]
}
背景:
我想使用重复记录将 JSON 插入到大查询 Table 中。
但是这些字段不需要重复,它只是在某些情况下发生。只要我有一个数组,一切都可以正常工作,如果缺少该数组,则会返回一个错误。
现在我正在寻找一些 python 函数,我只能说让我的 persons 元素成为一个只有一个元素的数组。
此致
编辑:
更具体一点:
我的结构如下所示。
{
"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 方法来实现我的要求,但我有点吃力。
您可以更改要列出的特定元素并重新分配:
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 提取)。
这是一种递归方法,它将所有 dicts
包含在 []
中的一个大 dict
中:
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'}]}]
我是 Python 的新手,已经有一段时间没有编码了。有没有办法将 JSON 结构中的元素转换为数组?
例子
鉴于:
{
"persons":
{
"city": "Seattle",
"name": "Brian"
}
}
必填:
{
"persons": [
{
"city": "Seattle",
"name": "Brian"
}
]
}
背景: 我想使用重复记录将 JSON 插入到大查询 Table 中。 但是这些字段不需要重复,它只是在某些情况下发生。只要我有一个数组,一切都可以正常工作,如果缺少该数组,则会返回一个错误。 现在我正在寻找一些 python 函数,我只能说让我的 persons 元素成为一个只有一个元素的数组。
此致
编辑:
更具体一点: 我的结构如下所示。
{
"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 方法来实现我的要求,但我有点吃力。
您可以更改要列出的特定元素并重新分配:
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 提取)。
这是一种递归方法,它将所有 dicts
包含在 []
中的一个大 dict
中:
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'}]}]