如何创建具有多个值的 JSON 对象数组?
How to create array of JSON objects with multiple values?
我尝试使用追加来创建一个新数组。但是,创建的函数 returns 是具有多个对象的数组而不是具有多个值的对象。
代码->
def parse_json(self, data):
file = 'vault.json'
json = {}
for obj in data:
if 'EMAIL' in obj[0]:
json.setdefault('EMAIL', []).append({obj[0]: obj[1]})
if 'TEST' in obj[0]:
json.setdefault('TEST', []).append({obj[0]: obj[1]})
else:
json.setdefault('VAULT', []).append({obj[0]: obj[1]})
with open(file, 'w') as f:
dump(json, f, indent=2, separators=(',', ':'))
响应 ->
{
"EMAIL":[
{"EMAIL_CC":""},
{"EMAIL_CCO":""},
{"EMAIL_DESTINY":"teste@gmail.com"}
]
}
想要的答案 ->
{
"EMAIL":{
"EMAIL_CC":"",
"EMAIL_CCO":"",
"EMAIL_DESTINY":"teste@gmail.com"
}
}
在python中,大括号{ }用于字典,类似于javascript对象(这听起来像你熟悉的)。硬括号 [ ] 称为列表。您想要的响应看起来像一个字典,其键以字典作为其值。不幸的是,您不能将键值对添加到 python 中的列表或数组中,因此您应该制作另一个字典而不是列表,或者重新考虑您想要的列表的样子(也许只有值而不是键)。
TL;DR:您正在将词典附加到您的列表中:
.append({obj[0]: obj[1]})
{obj[0]: obj[1]}
是您要附加到列表中的字典。
在 python 中,您可以拥有字典列表,但列表中不能只有键值对
使用dictionaries.
似乎当您添加到 json 时,您将数据添加为列表而不是字典。
此外,我想指出,您通常不应在这种情况下使用 setdefault
。您应该直接将键添加到字典中,因为它已经是空的。因此,您可以使用 json[obj[0]] = obj[1]
而不是 json.setdefault('EMAIL', []).append({obj[0]: obj[1]})
JSON 对象对应 Python 字典,JSON 数组对应 Python 列表——参见 json
模块的 documentation——所以您要创建的是基于您指示的所需答案的字典(不是列表字典)。这就是为什么创建列表并附加到它们是不合适的。
您没有提供任何输入样本 data
,并且您还遗漏了许多其他细节,所以我不得不做出一些猜测,但希望下面的代码显示的是什么足够相似,您可以看到它是如何应用的。
import json
class Class:
def parse_json(self, data):
categories = ('EMAIL', 'TEST')
file = 'vault.json'
json_obj = {}
for obj in data:
for group in categories:
if group in obj[0]:
category = json_obj.setdefault(group, {})
break
else:
category = json_obj.setdefault('VAULT', {})
category[obj[0]] = obj[1]
with open(file, 'w') as f:
json.dump(json_obj, f, indent=2, separators=(',', ':'))
data = [
["EMAIL_CC", ""],
["EMAIL_CCO", ""],
["EMAIL_DESTINY", "teste@gmail.com"],
["TEST_CC", ""],
["TEST_KARMA", "testf@gmail.com"],
["OTHER_CC", ""],
["SOMETHING_CC2", ""],
["FOOBAR_BAZ", "testg@gmail.com"],
]
cls = Class()
cls.parse_json(data)
print('-fini-')
创建的 vault.json
文件的内容:
{
"EMAIL":{
"EMAIL_CC":"",
"EMAIL_CCO":"",
"EMAIL_DESTINY":"teste@gmail.com"
},
"TEST":{
"TEST_CC":"",
"TEST_KARMA":"testf@gmail.com"
},
"VAULT":{
"OTHER_CC":"",
"SOMETHING_CC2":"",
"FOOBAR_BAZ":"testg@gmail.com"
}
}
我尝试使用追加来创建一个新数组。但是,创建的函数 returns 是具有多个对象的数组而不是具有多个值的对象。
代码->
def parse_json(self, data):
file = 'vault.json'
json = {}
for obj in data:
if 'EMAIL' in obj[0]:
json.setdefault('EMAIL', []).append({obj[0]: obj[1]})
if 'TEST' in obj[0]:
json.setdefault('TEST', []).append({obj[0]: obj[1]})
else:
json.setdefault('VAULT', []).append({obj[0]: obj[1]})
with open(file, 'w') as f:
dump(json, f, indent=2, separators=(',', ':'))
响应 ->
{
"EMAIL":[
{"EMAIL_CC":""},
{"EMAIL_CCO":""},
{"EMAIL_DESTINY":"teste@gmail.com"}
]
}
想要的答案 ->
{
"EMAIL":{
"EMAIL_CC":"",
"EMAIL_CCO":"",
"EMAIL_DESTINY":"teste@gmail.com"
}
}
在python中,大括号{ }用于字典,类似于javascript对象(这听起来像你熟悉的)。硬括号 [ ] 称为列表。您想要的响应看起来像一个字典,其键以字典作为其值。不幸的是,您不能将键值对添加到 python 中的列表或数组中,因此您应该制作另一个字典而不是列表,或者重新考虑您想要的列表的样子(也许只有值而不是键)。
TL;DR:您正在将词典附加到您的列表中:
.append({obj[0]: obj[1]})
{obj[0]: obj[1]}
是您要附加到列表中的字典。
在 python 中,您可以拥有字典列表,但列表中不能只有键值对
使用dictionaries.
似乎当您添加到 json 时,您将数据添加为列表而不是字典。
此外,我想指出,您通常不应在这种情况下使用 setdefault
。您应该直接将键添加到字典中,因为它已经是空的。因此,您可以使用 json[obj[0]] = obj[1]
json.setdefault('EMAIL', []).append({obj[0]: obj[1]})
JSON 对象对应 Python 字典,JSON 数组对应 Python 列表——参见 json
模块的 documentation——所以您要创建的是基于您指示的所需答案的字典(不是列表字典)。这就是为什么创建列表并附加到它们是不合适的。
您没有提供任何输入样本 data
,并且您还遗漏了许多其他细节,所以我不得不做出一些猜测,但希望下面的代码显示的是什么足够相似,您可以看到它是如何应用的。
import json
class Class:
def parse_json(self, data):
categories = ('EMAIL', 'TEST')
file = 'vault.json'
json_obj = {}
for obj in data:
for group in categories:
if group in obj[0]:
category = json_obj.setdefault(group, {})
break
else:
category = json_obj.setdefault('VAULT', {})
category[obj[0]] = obj[1]
with open(file, 'w') as f:
json.dump(json_obj, f, indent=2, separators=(',', ':'))
data = [
["EMAIL_CC", ""],
["EMAIL_CCO", ""],
["EMAIL_DESTINY", "teste@gmail.com"],
["TEST_CC", ""],
["TEST_KARMA", "testf@gmail.com"],
["OTHER_CC", ""],
["SOMETHING_CC2", ""],
["FOOBAR_BAZ", "testg@gmail.com"],
]
cls = Class()
cls.parse_json(data)
print('-fini-')
创建的 vault.json
文件的内容:
{
"EMAIL":{
"EMAIL_CC":"",
"EMAIL_CCO":"",
"EMAIL_DESTINY":"teste@gmail.com"
},
"TEST":{
"TEST_CC":"",
"TEST_KARMA":"testf@gmail.com"
},
"VAULT":{
"OTHER_CC":"",
"SOMETHING_CC2":"",
"FOOBAR_BAZ":"testg@gmail.com"
}
}