【问题标题】:How to properly parse embedded value from JSON如何正确解析来自 JSON 的嵌入值
【发布时间】:2020-09-09 19:14:39
【问题描述】:

我在为特定键解析此 json 时遇到问题:

sample.json:

{
    "AccessToken": {
        "ABCD": {
            "credential_type": "AccessToken",
            "secret": "abcdefghijklmnopqrstuxwxyz",
            "home_account_id": "4dafe035-ff2",
            "environment": "login.microsoftonline.com",
            "client_id": "f16f9f797",
            "target": "Directory.Read.All User.Read profile openid email",
            "realm": "56c621fa50f2",
            "token_type": "Bearer",
            "cached_at": "1599671717",
            "expires_on": "1599675316",
            "extended_expires_on": "1599675316"
        }
    },
    "Account": {
        "EFGH": {
            "home_account_id": "f977-41eb-8241613.56c62bbe-8598-4b85-9e51-1ca753fa50f2",
            "environment": "login.microsoftonline.com",
            "realm": "56c62bbe8598",
            "local_account_id": "4dafe0353-304e48a51613",
            "username": "foo@mail.com",
            "authority_type": "MS"
        }
    },
    "IdToken": {
        "WXYZ": {
            "credential_type": "IdToken",
            "secret": "abcdefghijklmnopqrstuxwxyz",
            "home_account_id": "4dafe035-ff2",
            "environment": "login.microsoftonline.com",
            "realm": "56c6a753fa50f2",
            "client_id": "f169aaf9f797"
        }
    }
}

目标是从“IdToken”部分解析和打印“秘密”。

abcdefghijklmnopqrstuxwxyz

到目前为止,我可以打印整个“IdToken”部分,但我只想要秘密。

import json

with open('sample.json') as json_file:
    data = json.load(json_file)

print(data['IdToken'])
print(data['IdToken'][0]['secret'])  #Tried this. Doesnot work

【问题讨论】:

    标签: python


    【解决方案1】:

    你需要做的

    print(data['IdToken']['WXYZ']['secret'])
    

    当您执行data['IdToken'][0] 时,如果data['IdToken'] 是一个数组,它会从data['IdToken'] 中获取第一个元素。但在这里,data['IdToken'] 是一个字典。要从 dict 中获取元素,您需要在方括号内使用 dict 键。

    编辑: (如果你不知道确切的键,但只知道位置)

    JSON 不保证 map/dict 中元素的顺序。因此,除非您确定 dict 中的项目将以特定顺序出现,否则不要使用此解决方案。但无论如何,这就是你如何做到的——你可以做到print(data['IdToken'][list(data['IdToken'].keys())[0]]['secret'])。还要确保在解析 JSON 时使用OrderedDict。看看这个答案 - https://stackoverflow.com/a/47111106/1421222

    【讨论】:

    • 那么如果WXYZ 是一些长的随机字符串(我不想在我的打印中添加),这就是我在这个例子中缩写它的原因。有没有办法在位置上做到这一点?换句话说,如果我有意义的话,IdToken 部分将始终是第三条记录。谢谢。
    • JSON 解析不保证 map/dict 中元素的顺序。因此,除非您确定 dict 中的项目将按特定顺序排列,否则我建议不要使用此解决方案。所以这就是你如何做到的 - 你可以做到print(data['IdToken'][list(data['IdToken'].keys())[0]]['secret'])。还要确保在解析 JSON 时使用OrderedDict。看看这个答案 - stackoverflow.com/a/47111106/1421222
    • 很好的解释与上下文。我会认为这两个答案都是有效的。欣赏它。
    【解决方案2】:

    如果你想在嵌套的数据字典上建立索引,你应该只使用它的键并将它附加到你索引它的列表中,索引为[0],以获得第一个键,它是字典并获取secret

    示例

    print(data['IdToken'][[*(data['IdToken'].keys())][0]]['secret'])
    

    上面的方法会得到IdToken的key,如果你不知道的话

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-09
      • 1970-01-01
      • 2016-09-03
      • 2021-12-13
      • 1970-01-01
      相关资源
      最近更新 更多