Python解析JSON文件

2024-10-16 20:46:06 发布

您现在位置:Python中文网/ 问答频道 /正文

{
    "Logging": {
        "LogLevel": {
            "Default": "Information",
            "Microsoft": "Warning",
            "Microsoft.Hosting.Lifetime": "Information",
            "Microsoft.AspNetCore": "Warning",
            "System.Net.Http.HttpClient.Default.ClientHandler": "Warning",
            "System.Net.Http.HttpClient.Default.LogicalHandler": "Warning"
        }
    },
    "AllowedHosts": "*",
    "AutomaticTransferOptions": {
        "DateOffsetForDirectoriesInDays": -1,
        "DateOffsetForPortfoliosInDays": -3,
        "Clause": {
            "Item1": "1"
        }    
    },
    "Authentication": {
        "ApiKeys": [
            {
                "Key": "AB8E5976-2A7C-4EEE-92C1-7B0B4DC840F6",
                "OwnerName": "Cron job",
                "Claims": [
                    {
                        "Type": "http://schemas.microsoft.com/ws/2008/06/identity/claims/role",
                        "Value": "StressTestManager"
                    }
                ]
            },
            {
                "Key": "B11D4F27-483A-4234-8EC7-CA121712D5BE",
                "OwnerName": "Test admin",
                "Claims": [
                    {
                        "Type": "http://schemas.microsoft.com/ws/2008/06/identity/claims/role",
                        "Value": "StressTestAdmin"
                    },
                    {
                        "Type": "http://schemas.microsoft.com/ws/2008/06/identity/claims/role",
                        "Value": "TestManager"
                    }
                ]
            },
            {
                "Key": "EBF98F2E-555E-4E66-9D77-5667E0AA1B54",
                "OwnerName": "Test manager",
                "Claims": [
                    {
                        "Type": "http://schemas.microsoft.com/ws/2008/06/identity/claims/role",
                        "Value": "TestManager"
                    }
                ]
            }
        ],
        "LDAP": {
            "Domain": "domain.local",
            "MachineAccountName": "Soft13",
            "MachineAccountPassword": "vixuUEY7884*",
            "EnableLdapClaimResolution": true
        }
    },
    "Authorization": {
        "Permissions": {
            "Roles": [
                {
                    "Role": "TestAdmin",
                    "Permissions": [
                        "transfers.create",
                        "bindings.create"
                    ]
                },
                {
                    "Role": "TestManager",
                    "Permissions": [
                        "transfers.create"
                    ]
                }
            ]
        }
    }
}

我上面有JSON,需要用如下输出解析它

Logging__LogLevel__Default
Authentication__ApiKeys__0__Claims__0__Type

一切正常,但我总是用这个输出得到一些字符串

Authentication__ApiKeys__0__Key
Authentication__ApiKeys__0__OwnerName
Authentication__ApiKeys__0__Claims__0__Type
Authentication__ApiKeys__0__Claims__0__Value
Authentication__ApiKeys__0__Claims__0
Authentication__ApiKeys__2
Authorization__Permissions__Roles__0__Role
Authorization__Permissions__Roles__0__Permissions__1
Authorization__Permissions__Roles__1__Role
Authorization__Permissions__Roles__1__Permissions__0
Authorization__Permissions__Roles__1

为什么我的代码不添加完整的字符串

Authentication__ApiKeys__0__Claims__0
Authentication__ApiKeys__2
Authorization__Permissions__Roles__1

以及为什么它不打印来自

Authorization__Permissions__Roles__0__Permissions__*

来自

Authorization__Permissions__Roles__1__Permissions__*

我在python3中有以下代码:

def checkdepth(sub_key, variable):
    delmt = '__'
    for item in sub_key:
        try:
            if isinstance(sub_key[item], dict):
                sub_variable = variable + delmt + item
                checkdepth(sub_key[item], sub_variable)
        except TypeError:
            continue

        if isinstance(sub_key[item], list):
            sub_variable = variable + delmt + item
            for it in sub_key[item]:
                sub_variable = variable + delmt + item + delmt + str(sub_key[item].index(it))
                checkdepth(it, sub_variable)
            print(sub_variable)

        if isinstance(sub_key[item], int) or isinstance(sub_key[item], str):
                sub_variable = variable + delmt + item
                print (sub_variable)

for key in data:   
    if type(data[key]) is str:
       print(key + '=' +str(data[key]))
    else:
      variable = key
      checkdepth(data[key], variable)

我知道我处理列表数据类型的块中的问题,但我不知道问题到底在哪里


Tags: keydefaultpermissionsauthenticationvaluetypeitemvariable
3条回答

使用json_flatte可以将其转换为pandas,但不清楚这是否是您想要的。此外,当您进行转换时,可以使用df.iloc[0]查看为什么要提供每个列(即您可以看到该键的值)

注意:您需要传递一个列表,所以我刚刚将您的json包装在[]中

# https://github.com/amirziai/flatten
dic = your json from above
dic =[dic] # put it in a list
dic_flattened = (flatten(d, '__') for d in dic) # add your delimiter
df = pd.DataFrame(dic_flattened)

df.iloc[0]

Logging__LogLevel__Default                                                                                    Information
Logging__LogLevel__Microsoft                                                                                      Warning
Logging__LogLevel__Microsoft.Hosting.Lifetime                                                                 Information
Logging__LogLevel__Microsoft.AspNetCore                                                                           Warning
Logging__LogLevel__System.Net.Http.HttpClient.Default.ClientHandler                                               Warning
Logging__LogLevel__System.Net.Http.HttpClient.Default.LogicalHandler                                              Warning
AllowedHosts                                                                                                            *
AutomaticTransferOptions__DateOffsetForDirectoriesInDays                                                               -1
AutomaticTransferOptions__DateOffsetForPortfoliosInDays                                                                -3
AutomaticTransferOptions__Clause__Item1                                                                                 1
Authentication__ApiKeys__0__Key                                                      AB8E5976-2A7C-4EEE-92C1-7B0B4DC840F6
Authentication__ApiKeys__0__OwnerName                                                                            Cron job
Authentication__ApiKeys__0__Claims__0__Type                             http://schemas.microsoft.com/ws/2008/06/identi...
Authentication__ApiKeys__0__Claims__0__Value                                                            StressTestManager
Authentication__ApiKeys__1__Key                                                      B11D4F27-483A-4234-8EC7-CA121712D5BE
Authentication__ApiKeys__1__OwnerName                                                                          Test admin
Authentication__ApiKeys__1__Claims__0__Type                             http://schemas.microsoft.com/ws/2008/06/identi...
Authentication__ApiKeys__1__Claims__0__Value                                                              StressTestAdmin
Authentication__ApiKeys__1__Claims__1__Type                             http://schemas.microsoft.com/ws/2008/06/identi...
Authentication__ApiKeys__1__Claims__1__Value                                                                  TestManager
Authentication__ApiKeys__2__Key                                                      EBF98F2E-555E-4E66-9D77-5667E0AA1B54
Authentication__ApiKeys__2__OwnerName                                                                        Test manager
Authentication__ApiKeys__2__Claims__0__Type                             http://schemas.microsoft.com/ws/2008/06/identi...
Authentication__ApiKeys__2__Claims__0__Value                                                                  TestManager
Authentication__LDAP__Domain                                                                                 domain.local
Authentication__LDAP__MachineAccountName                                                                           Soft13
Authentication__LDAP__MachineAccountPassword                                                                 vixuUEY7884*
Authentication__LDAP__EnableLdapClaimResolution                                                                      true
Authorization__Permissions__Roles__0__Role                                                                      TestAdmin
Authorization__Permissions__Roles__0__Permissions__0                                                     transfers.create
Authorization__Permissions__Roles__0__Permissions__1                                                      bindings.create
Authorization__Permissions__Roles__1__Role                                                                    TestManager
Authorization__Permissions__Roles__1__Permissions__0                                                     transfers.create

好的,我看了你的代码,很难理解。变量和函数名的用途不容易理解。这很好,因为每个人都必须学习python中的最佳实践和所有小技巧。希望我能帮你

  1. 你有一个递归函数。这绝对是处理这种情况的最好方法。然而,您的代码部分是递归的,部分不是。如果你去递归解决一个问题,你必须去100%递归

  2. 此外,在递归函数中打印的唯一时间是用于调试。递归函数应该有一个对象,该对象被传递给函数,并被追加或更改,然后在递归结束时被传递回

  3. 当您遇到这样的问题时,请思考您实际需要或关心哪些数据。在这个问题中,我们不关心存储在对象中的值,我们只关心键。因此,我们应该编写代码,除了确定其类型之外,甚至不需要查看某些内容的值

下面是我编写的一些代码,它们应该可以满足您的需要。但请注意,因为我只做了一个递归函数,所以我的代码库很小。我的函数还使用了一个传递并添加到的列表,然后在最后返回它,这样我们就可以使用它来满足任何需要。如果你有问题,就评论一下这个问题,我会尽我所能回答你

def convert_to_delimited_keys(obj, parent_key='', delimiter='__', keys_list=None):
    if keys_list is None: keys_list = []

    if isinstance(obj, dict):
        for k in obj:
            convert_to_delimited_keys(obj[k], delimiter.join((parent_key, str(k))), delimiter, keys_list)
    elif isinstance(obj, list):
        for i, _ in enumerate(obj):
            convert_to_delimited_keys(obj[i], delimiter.join((parent_key, str(i))), delimiter, keys_list)
    else:
        # Append to list, but remove the leading delimiter due to string.join
        keys_list.append(parent_key[len(delimiter):])
    return keys_list

for item in convert_to_delimited_keys(data):
    print(item)

使用递归生成器:

import json

with open('input.json') as f:
    data = json.load(f)

def strkeys(data):
    if isinstance(data,dict):
        for k,v in data.items():
            for item in strkeys(v):
                yield f'{k}__{item}' if item else k
    elif isinstance(data,list):
        for i,v in enumerate(data):
            for item in strkeys(v):
                yield f'{i}__{item}' if item else str(i)
    else:
        yield None # termination condition, not a list or dict

for s in strkeys(data):
    print(s)

输出:

Logging__LogLevel__Default
Logging__LogLevel__Microsoft
Logging__LogLevel__Microsoft.Hosting.Lifetime
Logging__LogLevel__Microsoft.AspNetCore
Logging__LogLevel__System.Net.Http.HttpClient.Default.ClientHandler
Logging__LogLevel__System.Net.Http.HttpClient.Default.LogicalHandler
AllowedHosts
AutomaticTransferOptions__DateOffsetForDirectoriesInDays
AutomaticTransferOptions__DateOffsetForPortfoliosInDays
AutomaticTransferOptions__Clause__Item1
Authentication__ApiKeys__0__Key
Authentication__ApiKeys__0__OwnerName
Authentication__ApiKeys__0__Claims__0__Type
Authentication__ApiKeys__0__Claims__0__Value
Authentication__ApiKeys__1__Key
Authentication__ApiKeys__1__OwnerName
Authentication__ApiKeys__1__Claims__0__Type
Authentication__ApiKeys__1__Claims__0__Value
Authentication__ApiKeys__1__Claims__1__Type
Authentication__ApiKeys__1__Claims__1__Value
Authentication__ApiKeys__2__Key
Authentication__ApiKeys__2__OwnerName
Authentication__ApiKeys__2__Claims__0__Type
Authentication__ApiKeys__2__Claims__0__Value
Authentication__LDAP__Domain
Authentication__LDAP__MachineAccountName
Authentication__LDAP__MachineAccountPassword
Authentication__LDAP__EnableLdapClaimResolution
Authorization__Permissions__Roles__0__Role
Authorization__Permissions__Roles__0__Permissions__0
Authorization__Permissions__Roles__0__Permissions__1
Authorization__Permissions__Roles__1__Role
Authorization__Permissions__Roles__1__Permissions__0

相关问题 更多 >