python - 如何将嵌套的 json 键收集到线性列表
问题描述
我正在使用大型嵌套 json 并且需要收集所有 Json 键来列出,即:
对于 json:
{"taxIncludedAmount":{},"impactingPriceParameter":[{}],"extensions":{"additionalProp1":{}}}}
我想将密钥收集到列表中,并添加括号,以便我知道密钥的类型。所以对于上面的json我想得到(包括正确的顺序):
eventType
event{}.dataStrategy
event{}.error{}.code
event{}.error{}.characteristics[].name
我设法使用找到的一些代码示例来获取所有键,但无法找到一种方法来为 dic 添加括号 {} 和为列表添加 []。
代码:
def get_keys(d, curr_key=[]):
for k, v in d.items():
if isinstance(v, dict):
yield from get_keys(v, curr_key + [k])
elif isinstance(v, list):
for i in v:
yield from get_keys(i, curr_key + [k])
else:
yield '.'.join(curr_key + [k])
def main():
array_json_keys = [*get_keys(json_data)]
输出:
event.dataStrategy
event.error.characteristics.name
event.error.code
eventType
这是“几乎就在那里,我需要添加方括号({} 表示 dic,[] 表示数组)此外我想对其进行排序,以便首先显示第一级对象。
更新:
感谢@blhsing - 它解决了括号,由于某种原因它在示例中跳过了空键
"impactingPriceParameter": [
{}
]
or
"extensions": {
"additionalProp1": {}
}
解决方案
您可以根据 value 的数据类型简单地连接'{}'
或连接'[]'
到键:k
v
def get_keys(d, curr_key=[]):
for k, v in d.items():
if isinstance(v, dict):
yield from get_keys(v, curr_key + [k + '{}'])
elif isinstance(v, list):
for i in v:
yield from get_keys(i, curr_key + [k + '[]'])
else:
yield '.'.join(curr_key + [k])
推荐阅读
- aws-sdk - 在 clojurescript/reagent shadow-cljs 应用程序中需要 aws-amplify v.3 Amplify 和 Auth 类
- c# - 配置 HttpClient 以使用服务填充身份验证标头?
- java - Google Play 订阅:“帐户保留”和“宽限期”之间的干扰
- c++ - 模板化模板参数 U
不识别 const 限定符 - dynamics-crm - 在 Microsoft Dynamics 365 中批量更新实体消息
- php - PHP、未定义索引、isset 和单选按钮
- python - 如何在 tensorflow 的 Conv 层中制作一个/一些过滤器?
- angular - 返回 Observable 时,Angular 路由守卫无法按预期工作
- python - MemoryError:无法为 DIPY 图像配准中形状 (344、344、127) 和数据类型 float64 的数组分配 115.MiB
- c# - 缺少程序集参考 - 确保 VS 为我的 nuget 包创建一个 .config 文件