Linux의 긴 json 파일에서 javascript 키 경로를 얻는 방법

Linux의 긴 json 파일에서 javascript 키 경로를 얻는 방법

저는 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"에 대한 경로와 해당 값을 인쇄합니다.

관련 정보