如何自动解析JSON并获取一个变量中的所有键值对?
How to automatically parse JSON and get all key value pairs in a variable?
我正在尝试动态创建数据库而不对列和行的所有 API 响应值进行硬编码,因此我想学习如何通过 JSON 自动解析并将所有keys/values 在一个变量中,这样我就可以对它们进行排序并将它们放入数据库中。
假设我有一些像这样的 JSON:
(命运 2 API 响应的修改片段缩进 5)
{
"Response": {
"profile": {
"data": {
"userInfo": {
"crossSaveOverride": 1,
"applicableMembershipTypes": [
3,
1
],
"isPublic": true,
"membershipType": 1,
"membershipId": "123",
"displayName": "Name1",
"bungieGlobalDisplayName": "name again",
"bungieGlobalDisplayNameCode": 0000
},
"dateLastPlayed": "2021-6-18T02:33:01Z",
"versionsOwned": 127,
"characterIds": [
"id1",
"id2",
"id3"
],
"seasonHashes": [
3243434344,
3423434244,
3432342443,
3434243244
],
"currentSeasonHash": 3434243244,
"currentSeasonRewardPowerCap": 1330
},
"privacy": 1
}
},
"ErrorCode": 1,
"ThrottleSeconds": 0,
"ErrorStatus": "Success",
"Message": "Ok",
"MessageData": {}
}
我想自动解析并获取所有 key/values 减去错误代码区域,因此 "Response"
下的所有内容。它将全部进入数据库,例如:
displayName
isPublic
Name1
True
Name2
False
我知道如何正常解析或循环但只能获取如下值:
displayName = Response["Response"]["profile"]["data"]["userInfo"]["displayName"]
如何抓取所有的键和值,然后从最底层自动存储到一个变量中?另外,如果不需要密钥,如何排除它们?
编辑:添加说明
我了解到这个 JSON 响应类型是一个字典,我可以使用 Response.keys()
和 Response.values()
来获取键和值。
我想问的是,从Response["Response"]
开始,如何将所有键和值都放到底层并排除我不需要的。
例如,如果我这样做:
r = Response["Response"]
for key in r.keys():
print(key)
我只会得到 profile
,这是我不需要的。
我必须这样做:
r = Response["Response"]["profile"]["data"]["userInfo"]
for key in r.keys():
print(key)
这会 return
crossSaveOverride
applicableMembershipTypes
isPublic
membershipType
membershipId
displayName
bungieGlobalDisplayName
bungieGlobalDisplayNameCode
这是我需要的但我不想手动定义
["Response"]["profile"]["data"]["userInfo"]
或类似的每个响应。我想自动抓取所有内容,同时排除我不需要的项目。
Dmitry Torba 在 发布了一个功能,可以满足您的需求。
def recursive_items(dictionary):
for key, value in dictionary.items():
if type(value) is dict:
yield from recursive_items(value)
else:
yield (key, value)
a = {'a': {1: {1: 2, 3: 4}, 2: {5: 6}}}
for key, value in recursive_items(a):
print(key, value)
我正在尝试动态创建数据库而不对列和行的所有 API 响应值进行硬编码,因此我想学习如何通过 JSON 自动解析并将所有keys/values 在一个变量中,这样我就可以对它们进行排序并将它们放入数据库中。
假设我有一些像这样的 JSON:
(命运 2 API 响应的修改片段缩进 5)
{
"Response": {
"profile": {
"data": {
"userInfo": {
"crossSaveOverride": 1,
"applicableMembershipTypes": [
3,
1
],
"isPublic": true,
"membershipType": 1,
"membershipId": "123",
"displayName": "Name1",
"bungieGlobalDisplayName": "name again",
"bungieGlobalDisplayNameCode": 0000
},
"dateLastPlayed": "2021-6-18T02:33:01Z",
"versionsOwned": 127,
"characterIds": [
"id1",
"id2",
"id3"
],
"seasonHashes": [
3243434344,
3423434244,
3432342443,
3434243244
],
"currentSeasonHash": 3434243244,
"currentSeasonRewardPowerCap": 1330
},
"privacy": 1
}
},
"ErrorCode": 1,
"ThrottleSeconds": 0,
"ErrorStatus": "Success",
"Message": "Ok",
"MessageData": {}
}
我想自动解析并获取所有 key/values 减去错误代码区域,因此 "Response"
下的所有内容。它将全部进入数据库,例如:
displayName | isPublic |
---|---|
Name1 | True |
Name2 | False |
我知道如何正常解析或循环但只能获取如下值:
displayName = Response["Response"]["profile"]["data"]["userInfo"]["displayName"]
如何抓取所有的键和值,然后从最底层自动存储到一个变量中?另外,如果不需要密钥,如何排除它们?
编辑:添加说明
我了解到这个 JSON 响应类型是一个字典,我可以使用 Response.keys()
和 Response.values()
来获取键和值。
我想问的是,从Response["Response"]
开始,如何将所有键和值都放到底层并排除我不需要的。
例如,如果我这样做:
r = Response["Response"]
for key in r.keys():
print(key)
我只会得到 profile
,这是我不需要的。
我必须这样做:
r = Response["Response"]["profile"]["data"]["userInfo"]
for key in r.keys():
print(key)
这会 return
crossSaveOverride
applicableMembershipTypes
isPublic
membershipType
membershipId
displayName
bungieGlobalDisplayName
bungieGlobalDisplayNameCode
这是我需要的但我不想手动定义
["Response"]["profile"]["data"]["userInfo"]
或类似的每个响应。我想自动抓取所有内容,同时排除我不需要的项目。
Dmitry Torba 在
def recursive_items(dictionary):
for key, value in dictionary.items():
if type(value) is dict:
yield from recursive_items(value)
else:
yield (key, value)
a = {'a': {1: {1: 2, 3: 4}, 2: {5: 6}}}
for key, value in recursive_items(a):
print(key, value)