如何创建具有多个值的 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"
  }
}