【问题标题】:How to create array of JSON objects with multiple values? [closed]如何创建具有多个值的 JSON 对象数组? [关闭]
【发布时间】:2022-01-07 12:42:31
【问题描述】:

我尝试使用附加来创建一个新数组。但是,创建的函数返回一个包含多个对象的数组,而不是一个包含多个值的对象。

代码->

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"
  }
}

【问题讨论】:

  • 您应该edit您的问题并添加正在解析的数据样本。

标签: python append


【解决方案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"
  }
}

【讨论】:

    【解决方案2】:

    使用dictionaries

    似乎当您添加到 json 时,您将数据添加为列表而不是字典。

    另外,我想指出,在这种情况下,您通常不应该使用 setdefault。您应该直接将键添加到您的字典中,因为它已经是空的。所以不用json.setdefault('EMAIL', []).append({obj[0]: obj[1]}),你可以用json[obj[0]] = obj[1]

    【讨论】:

    • 知道了,但是如何命名数组索引?示例:{“INDEX”:{“EMAIL_CC”:“”,“EMAIL_CCO”:“TEST@GMAIL.COM”},“INDEX”:{“TEST”:“123”,“TEST2”:“1234”}}
    • 如果我理解正确,您的意思是键而不是索引。但是命名很简单:my_dictionary[key] = value,其中key是索引。
    【解决方案3】:

    在 python 中,大括号 { } 用于字典,类似于 javascript 对象(听起来很熟悉)。硬括号 [ ] 称为列表。您所需的响应看起来像一个字典,其键具有字典作为其值。不幸的是,您不能在 python 中将键值对添加到列表或数组中,因此您应该创建另一个字典而不是列表,或者重新考虑您想要的列表的外观(可能只有值而不是键)。

    TL;DR:您正在将字典附加到您的列表中: .append({obj[0]: obj[1]})
    {obj[0]: obj[1]} 是您要附加到列表的字典。 在 python 中,你可以有一个字典列表,但你不能在一个列表中只有键值对

    【讨论】:

      猜你喜欢
      • 2012-06-27
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      • 2019-12-15
      • 1970-01-01
      • 1970-01-01
      • 2013-05-14
      • 1970-01-01
      相关资源
      最近更新 更多