web-dev-qa-db-ja.com

jq解析取得値

Jsonファイルからいくつかの値を取得する必要があります。配列を取得する必要があります(dimmer1、dimmer2)

誰かアイデアは?

{
 "devices": {
    "dimmer1": {
      "protocol": ["kaku_dimmer"],
      "state": "off",
      "dimlevel": 1
    },
    "dimmer2": {
      "protocol": ["kaku_dimmer"],
      "state": "off",
      "dimlevel": 1
    }
}
12
user3467696

編集:コメントを明確にした後、キーが「調光器」で始まるデバイスの状態を取得するには、次を使用します

_jq '[ .devices | to_entries[] | select(.key | startswith("dimmer")) | .value = .value.state ] | from_entries' filename.json
_

出力:

_{
  "dimmer1": "off",
  "dimmer2": "off"
}
_

これは次のように機能します。

  • _.devices_は、JSONオブジェクトの_.devices_属性を選択します
  • _to_entries_は、オブジェクトをその属性(デバイス)を説明するキーと値のペアの配列に分解します。つまり、属性_"foo": "bar"_がオブジェクト_{ "key": "foo", "value": "bar" }_になり、分解されたオブジェクトはそのようなオブジェクトの配列に展開されます(属性ごとに1つ)
  • _to_entries[]_をパイプで通すために、その配列をアンパックします
  • select(.key | startswith("dimmer"))、キーがdimmerで始まるデバイスを選択します
  • _.value = .value.state_は、デバイスを説明するキーと値のペアを再構築して、値がそのstate属性だけで置き換えられるようにします
  • _[ all that ]_は、これらすべてのJSON配列を作成し、
  • _[ all that ] | from_entries_は、キーと値のペアの配列をJSONオブジェクトに変換します。

古い回答(短縮)、現在は使用されていませんが、おそらく関心があります。

配列内のdevicesの属性のキーを取得するには:

_jq '.devices | keys' filename.json
_

値を(配列でも)取得するには、

_jq '[ .devices[] ]' filename.json
_

あなたがそれらの2つのうちのどちらを意味するのか、私には完全にはわかりませんでした。

24
Wintermute