入れ子になったキーの文字列値をテストするために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

答え2

より良いオプションはJSONパーサーを使用することです。

あなたが使用を主張する場合grep

grepPCRE(-P)をサポートしているとします。

bspwm | grep -Po '"state":\K[^,]*'

これはキー(引用符を含む)の値を取得します"state"

キーの周りに引用符が必要ない場合:

bspwm | grep -Po '"state":"\K[^"]*'

たとえば、

% grep -Po '"state":\K[^,]*' <<<'{"id":29360131,"splitType":"vertical","splitRatio":0.500000,"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}}'

"floating"


% grep -Po '"state":"\K[^"]*' <<<'{"id":29360131,"splitType":"vertical","splitRatio":0.500000,"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}}'

floating

答え3

次の専用JSONパーサーを使用してください。地面、より強力な方法です。

jshon -e client -e state -u < file             
floating

答え4

JSONから情報を抽出してテストするもう1つの簡単な選択肢は次のとおりです。jtcツール(ソースjsonがあると仮定file.json):

bash $ cat file.json | jtc -w "[state]:<tiling>" | grep "tiling" >/dev/null; if [ $? == 0 ]; then echo "true"; else echo "false"; fi;
false
bash $ 
bash $ cat file.json | jtc -w "[state]:<floating>" | grep "floating" >/dev/null; if [ $? == 0 ]; then echo "true"; else echo "false"; fi;
true
bash $ 

関連情報