의미 있는 정보를 나타내기 위해 "ObjectType" 키로 태그가 지정된 중첩된 셀 구조가 있는 매우 큰 반구조적 JSON 스키마가 있습니다.
저는 jq를 사용하여 이러한 모든 ObjectType의 경로와 해당 값을 선택하려고 합니다.
json의 예시 부분은 다음과 같습니다:
{
"ObjectType": "ClassZ",
"LastModifiedBy": "janeroe",
"Name": "Anonymous",
"ArrayProps": [],
"Logistics": [
{
"ObjectType": "ClassA",
"Source": "Vendor",
"UUID": "x868-dhibye9-7678-12",
"EffectiveDate": "2020-01-01",
"Active": true,
"Preferred": 0
}
],
"IsVirtual": true,
"Convention": 3,
"CruiseParams": [
{
"ObjectType": "ClassB",
"Destinaton": "Atlantis",
"Value": "3"
}
],
"InvolvedParties": [],
"PartyEvents": [
{
"ObjectType": "ClassC",
"CreatedDate": "2020-01-01",
"CreatedBy": "johndoe"
}
],
"FunFactors": [
{
"ObjectType": "ClassD",
"Level": 1
}
]
}
다음과 유사하거나 가까운 것을 출력해 보십시오.
"ObjectType": "ClassZ"
"Logistics/0/ObjectType": "ClassA"
"CruiseParams/0/ObjectType": "ClassB"
"PartyEvents/0/ObjectType": "ClassC"
"FunFactors/0/ObjectType": "ClassD"
답변1
이것이 내가 생각할 수 있는 최선의 것입니다.jq를 사용하여 찾은 값의 인덱스 경로를 얻는 방법은 무엇입니까?
$ jq -rc 'paths as $p | select($p[-1] == "ObjectType") | "\($p|@csv): \"\(getpath($p))\""' sample.json
"ObjectType": "ClassZ"
"Logistics",0,"ObjectType": "ClassA"
"CruiseParams",0,"ObjectType": "ClassB"
"PartyEvents",0,"ObjectType": "ClassC"
"FunFactors",0,"ObjectType": "ClassD"
인용 및 구분은 귀하가 요청한 것과 정확히 일치하지 않습니다. map(tostring)| join(“/“)
댓글에서 제안한 내용을 사용합니다.
$ jq -rc 'paths as $p | select($p[-1] == "ObjectType") | "\"\($p|map(tostring)|join("/"))\": \"\(getpath($p))\""' sample.json
"ObjectType": "ClassZ"
"Logistics/0/ObjectType": "ClassA"
"CruiseParams/0/ObjectType": "ClassB"
"PartyEvents/0/ObjectType": "ClassC"
"FunFactors/0/ObjectType": "ClassD"