我正在使用一个长 JavaScript 对象中的多个键,表示为 json。例子:
...
"stock": {
"type": 'str',
"properties": {
"warehouse": {
"type": 123
},
"retail": {
"type": false
}
}
}
...
例如,我想知道 key 的完整路径type
。比如无需手动get-paht type
获取即可。root.somethingElse.stock.properties.retail.type
这是一个很长的文件,上下搜索似乎效率不高......
Cli 或 Gui 工具都可以。但是我找不到任何返回该结果的应用程序、扩展程序或命令行工具。
我尝试了 Chrome 的“JsonView”,但无法让它加载本地文件。
杰克似乎也没有解决这个问题,因为缺少一些双引号。
编辑:我意识到这是一个 js 对象,尽管表示为 json。
答案1
从一个开始正确形成并完成 MWE :
{
"stock": {
"type": "str",
"properties": {
"warehouse": {
"type": 123
},
"retail": {
"type": false
}
}
}
}
然后使用jq
(v1.5):
$ jq -M -c 'path(..|.type? // empty) | join(".")' mwe.json
"stock.type"
"stock.properties.warehouse.type"
(添加-r
以省略输出中的引用,-M
并且-c
仅用于格式化输出)。这会向下递归结构 ( ..
) 寻找“类型”的索引或键,?
当不合适时抑制错误 ( ),//
当值为 false 或 null 时评估为“空”( ),然后展平 ( join()
) 路径数组。
一个可能的问题是false
值(或 null)触发empty
(至少在 v1.5 中,但在 v1.4 中不是)并且该stock.properties.retail.type
项目被省略。
如果没有,| join(".")
您将获得 JSON 数组,这也可能很有用:
["stock","type"]
["stock","properties","warehouse","type"]
更复杂的版本,包括值:
$ jq -M -c '[paths(.|select(type=="object" and has("type")) )][] \
as $path | [$path+["type"], getpath($path + ["type"])]' mwe.json
[["stock","type"],"str"]
[["stock","properties","warehouse","type"],123]
[["stock","properties","retail","type"],false]
这是更优雅一点,它通过选择具有“type”子代的所有对象来创建一个数组,然后打印“type”的路径及其值。