入れ子になったキーの文字列値をテストするためにJSONを解析する方法は?

入れ子になったキーの文字列値をテストするためにJSONを解析する方法は?

たとえば、次は私のプログラムの出力です(気になっている場合はbspwm)。

{
  "id": 29360131,
  "splitType": "vertical",
  "splitRatio": 0.5,
  "birthRotation": 90,
  "vacant": true,
  "sticky": false,
  "private": false,
  "locked": false,
  "presel": null,
  "rectangle": {
    "x": 0,
    "y": 0,
    "width": 1920,
    "height": 1200
  },
  "firstChild": null,
  "secondChild": null,
  "client": {
    "className": "Termite",
    "instanceName": "termite",
    "borderWidth": 1,
    "state": "floating",
    "lastState": "tiled",
    "layer": "normal",
    "lastLayer": "normal",
    "urgent": false,
    "visible": true,
    "icccmFocus": true,
    "icccmInput": true,
    "minWidth": 10,
    "maxWidth": 0,
    "minHeight": 19,
    "maxHeight": 0,
    "wmStatesCount": 0,
    "wmState": [],
    "tiledRectangle": {
      "x": 0,
      "y": 0,
      "width": 958,
      "height": 1198
    },
    "floatingRectangle": {
      "x": 638,
      "y": 394,
      "width": 642,
      "height": 410
    }
  }
}

"state"私はそれが真であることを確認したかった"tiling"。この場合です"floating"

ベストアンサー1

ブールテストでjqを使用する

JSONが次の変数に保存されているとします。JSON、シェルプロンプトで次のことができます。

$ echo "$json" | jq '.client.state | test("tiling")'
false

コーパスには対応する値が含まれているため、falseを正しく返しますfloating

否定的なテスト

または値が次のようにテストしたい場合いいえ tiling| notフィルタを使用してテストロジックを無効にできます。たとえば、

$ echo "$json" | jq '.client.state | test("tiling") | not'
true

クライアントの状態ではないため、これは正しくtrueを返しますtilingfloating

価値抽出

フィルタが通常の方法で機能することを確認するには、jqを使用してネストされたキー値を解析することもできます。たとえば、

$ echo "$json" | jq .client.state
"floating"

その後、その情報を使用してテストとフィルタを検証できます。あるいは、追加のプロセスを作成しても問題ない場合は、その情報をシェルパイプラインからまたはにfgrep渡します。fgrep -v

おすすめ記事