중첩된 키의 문자열 값을 테스트하기 위해 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를 반환합니다 tiling.floating

가치 추출

필터가 일반적인 방식으로 작동하는지 확인하려면 jq를 사용하여 중첩된 키 값을 구문 분석할 수도 있습니다. 예를 들어:

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

그런 다음 해당 정보를 사용하여 테스트 및 필터를 검증할 수 있습니다. 또는 추가 프로세스를 생성해도 괜찮다면 해당 정보를 셸 파이프라인에서 fgrep또는로 전달하면 됩니다.fgrep -v

답변2

더 나은 옵션은 JSON 파서를 사용하는 것입니다.

당신이 사용을 주장하는 경우 grep:

grepPCRE( -P) 를 지원한다고 가정합니다 .

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

이것은 key (따옴표 포함) 값을 얻습니다 "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에서 정보를 추출하고 테스트하는 또 다른 간단한 대안은 다음과 같습니다.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 $ 

관련 정보