深くネストされたJSONで、特定のキー名の特定のすべてのキーパスと値を選択します。

深くネストされたJSONで、特定のキー名の特定のすべてのキーパスと値を選択します。

意味のある情報を表すために、「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"

おすすめ記事