저는 json으로 표시되는 긴 JavaScript 개체에서 여러 키를 사용하여 작업하고 있습니다. 예:
...
"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"를 사용해 보았으나 로컬 파일을 로드할 수 없었습니다.
잭일부 큰따옴표가 누락되어 문제가 해결되지 않는 것 같습니다.
편집하다:비록 json으로 표시되지만 이것이 js 객체라는 것을 알고 있습니다.
답변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
) 이는 "type"의 인덱스 또는 키를 찾는 -c
구조( )를 반복하여 부적절할 때 오류를 억제하고( ) 값이 false 또는 null일 때 "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"에 대한 경로와 해당 값을 인쇄합니다.