1

これが私のテストデータです:

[
  {
    "id": "id-1",
    "tags": {
      "key": "name",
      "value": "name-1"
    }
  },
  {
    "id": "id-2"
  }
]

出力を簡素化し、存在する場合は「名前」フィールドを表示し、常に ID を表示しようとしています。たとえば、次のスクリプトはほとんど機能します。

~ $ cat testdata | jq '.[] | {id, name: .tags.value}'

{
  "id": "id-1",
  "name": "name-1"
}
{
  "id": "id-2",
  "name": null
}

存在しない .keys に対するガードを追加し、気になる「キー」のセクションをフィルタリングしようとすると、次のようになります。

~ $ cat testdata | jq '.[] | {id, name: (select(.tags.key == "name") | .tags.value)}'

{
  "id": "id-1",
  "name": "name-1"
}

{} は、どういうわけか「null」ではなく長さゼロの配列になってしまうと思います。| の代わりに何を使用すればよいですか? 私は何を誤解していますか?

4

4 に答える 4

0

私が正しく理解している場合、名前が存在する場合にのみ名前を含めたい場合は、次のようにします。

map({id} + with_entries(select(.key == "tags") | .value))

nullそれ以外の場合は、名前を気にしない場合:

map({id, name: with_entries(select(.key == "tags") | .value) | .name})

他の「タグ」がある場合のより一般的な解決策を次にname示します。値のみを受け入れるようにハードコーディングされていません。

これは、すべてのオブジェクト値が実際にはキーと値のペアであることを前提としています。

map(with_entries(if .value | type == "object" then .value else . end))

または、tagsが唯一の動的プロパティである場合:

map(with_entries(if .key == "tags" then .value else . end))
于 2014-07-27T05:44:33.200 に答える
0

[POSSIBLY_MATCHED_EXPRESSION][0]この場合、: を使用して問題を解決しました。

 cat testdata | jq '.[] | {id, name: ([select(.tags.key == "name") | .tags.value][0])}'
于 2014-07-27T04:49:14.877 に答える