【问题标题】:How to get all elements in the list from JSON in python code如何在python代码中从JSON获取列表中的所有元素
【发布时间】:2021-12-08 17:19:21
【问题描述】:

试图找出正确的语法来遍历列表以获取所有值并插入到 oracle 中。

编辑: 下面是json结构:

[{
  "publishTime" : "2021-11-02T20:18:36.223Z",
  "data" : {
    "DateTime" : "2021-11-01T15:10:17Z",
    "Name" : "x1",
    "frtb" : {
      "code" : "set1"
    },
    "mainAccounts" : [ {
      "System" : {
        "identifier" : {
          "domain" : "System",
          "id" : "xxx"
        },
        "name" : "TEST1"
      },
      "Account" : "acc1"
    }, {
      "System" : {
        "identifier" : {
          "domain" : "System",
          "id" : "xxx"
        },
        "name" : "TEST2"
      },
      "Account" : "acc2"
    }, {
      "System" : {
        "identifier" : {
          "domain" : "System",
          "id" : "xxx"
  
        },
        "name" : "TEST3"
      },
      "Account" : "acc3"
    }],
    "sub" : {
      "ind" : false,
      "identifier" : {
        "domain" : "ops",
        "id" : "1",
        "version" : "1"
      }]

我的python代码:

insert_statement = """INSERT INTO mytable VALUES (:1,:2)"""

r =requests.get(url, cert=(auth_certificate, priv_key), verify=root_cert, timeout=3600)

data=json.loads(r.text)

myrows = []


for item in data:
 
  try:
        name = (item.get("data").get("Name"))
  except AttributeError:
        name=''
  try:
        account= (item.get("data").get("mainAccounts")[0].get("Account") )
  except TypeError:
        account=''

  rows=(name,account)
  myrows.append(rows)

cursor.executemany(insert_statement,myrows)  
connection_target.commit()

上面我只得到列表中“帐户”的第一个值,即 ("acc1") ,如何获取所有值,即 (acc1,acc2,acc3) ?

我在下面尝试过但没有成功:

尝试: Account = (item.get("data").get("mainAccounts")[0].get("Account") for item in data["mainAccounts") 除了类型错误: 帐户=''

请多多指教。感谢您的帮助。

【问题讨论】:

  • for item in data: accounts = [act["Account"] for act in item.get("data", {}).get("mainAccounts", [])] ?我能问一下您为什么在这里期待TypeError 吗?
  • 抱歉语法无效
  • 你把它放在哪里?对于您的第一行for item in data:。对于您的第二行accounts = [act["Account"] for act in item.get("data", {}).get("mainAccounts", [])]。没有try/except。就在你定义data之后的那两行代码。
  • 如果您仍然有问题,我会将其作为格式化答案发布。
  • 对不起,我尝试过/除了。我正在尝试将此数据输入 oracle ,现在我得到“cx_Oracle.NotSupportedError:OCI 不支持数组数组

标签: python json


【解决方案1】:
import json
my_json = json.load(open("my_json.json", 'r'))

>>> mainAccounts = my_json['mainAccounts']
>>> for account in mainAccounts:
...    account_name = account['Account']
...    system_domain = account['System']['identifier']['domain']
...    system_id = account['System']['identifier']['id']
...    system_name = account['System']['name']
...    print(f"\n======={account_name}==========")
...    print(f"System domain: {system_domain}")
...    print(f"System id: {system_id}")
...    print(f"System name: {system_name}")




=======acc1==========
System domain: System
System id: xxx
System name: TEST1

=======acc2==========
System domain: System
System id: xxx
System name: TEST2

=======acc3==========
System domain: System
System id: xxx
System name: TEST3

【讨论】:

    【解决方案2】:

    我之前没有使用过 Oracle,所以我假设您的 SQL 语句是正确的,并且需要 tuple(name, account_number)

    data = [
        {
            "publishTime" : "2021-11-02T20:18:36.223Z",
            "data" : {
                "DateTime" : "2021-11-01T15:10:17Z",
                "Name" : "x1",
                "frtb" : {
                    "code" : "set1"
                },
                "mainAccounts" : [ 
                    {
                        "System" : {
                            "identifier" : {
                                "domain" : "System",
                                "id" : "xxx"
                            },
                            "name" : "TEST1"
                        },
                        "Account" : "acc1"
                    }, {
                        "System" : {
                            "identifier" : {
                                "domain" : "System",
                                "id" : "xxx"
                            },
                            "name" : "TEST2"
                        },
                        "Account" : "acc2"
                    }, {
                        "System" : {
                            "identifier" : {
                                "domain" : "System",
                                "id" : "xxx"
                            },
                            "name" : "TEST3"
                        },
                        "Account" : "acc3"
                    }
                ],
                "sub" : {
                    "ind" : False,
                    "identifier" : {
                        "domain" : "ops",
                        "id" : "1",
                        "version" : "1"
                    }
                }
            }
        }
    ]
    
    myrows = []
    for item in data:
        accounts = [
            (act["System"]["name"], act["Account"]) 
            for act in item.get("data", {}).get("mainAccounts", [])
        ]
        myrows.extend(accounts)
        
    print(myrows) # [('TEST1', 'acc1'), ('TEST2', 'acc2'), ('TEST3', 'acc3')]
    

    然后假设它的格式正确。

    cursor.executemany(insert_statement, myrows)
    

    它是如何工作的:

    此行获取您的顶级dict 并将其分配给item。 我使用了for 循环,以防list 中有多个dicts。

    for item in data:
    

    list 理解有点复杂。但是可以翻译成这个。

    accounts = []
    for act in item.get("data", {}).get("mainAccounts", []):
        name = act["System"]["name"]
        account = act["Account"]
        accounts.append(name, account)
    

    或者更加简化:

    data_dict = item.get("data", {})
    main_accounts_list = data_dict.get("mainAccounts", [])
    for act in main_accounts_list:
        # the rest of the code
    

    我使用dict.get() 和一个空的dictlist 作为默认值,这样即使密钥不存在,它仍然能够处理后续的.get 和迭代而不会出错。

    最后,你是extend my_rows 而不是append 所以你添加的不是listlist

    myrows.extend(accounts)
    

    【讨论】:

    • 感谢@Axe319 的解释。这会打印出正确的结果,但是当我尝试插入时,我的终端上会出现“被杀死”的消息。我不认为这是内存,因为系统具有大量资源。我不确定是什么原因造成的..
    • 感谢@axe319 提供上述信息。我能够解决错误。我不得不更改与上述类似的其他字段的语法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多