2017-01-20 1 views
2

데이터를 일치하지 --arg 나의 컬로부터 샘플 JSON 응답이다숫자 인자 여기 ==

{ 
    "success": true, 
    "message": "jobStatus", 
    "jobStatus": [ 
    { 
     "ID": 9, 
     "status": "Successful" 
    }, 
    { 
     "ID": 2, 
     "status": "Successful" 
    }, 
    { 
     "ID": 99, 
     "status": "Failed" 
    } 
    ] 
} 

내가 ID = 2의 상태를 확인하고 싶다.

cat test.txt|jq --arg v "2" '.jobStatus[]|select(.ID == $v)|.status' 

응답 : 여기에 내가 시도 명령은 아무도

내가 따옴표없이 값 2과 여전히 결과 시도가 없습니다. 나는 문자2으로 명령을하려고하면

는 대조적으로, 그것은 작동합니다

cat test.txt | jq '.jobStatus[]|select(.ID == 2)|.status' 

응답 :

"Successful" 

내가 붙어있어. 아무도 내가 문제를 파악하도록 도울 수 있습니까?

답변

5

jq 데이터 타입인지 경우 : JSON 입력에 정의

  • .ID하는 번호,

  • 있지만 명령 줄 인수 인--arg으로 전달됩니다 (예 : v). 항상 입니다.

    jq --arg v '2' '.jobStatus[] | select(.ID == ($v | tonumber)) | .status' test.txt 
    

    : 문자열
    은 (당신이 값을 인용 여부),

때문에, 그것들을 비교하기 위해, 당신은 같은 tonumber/1와 같은 명시 적 타입 변환를 사용해야합니다

여기에 스칼라 인수 만 전달하면 --argjson (jq v1.

jq --argjson v '{ "ID": 2 }' '.jobStatus[] | select(.ID == $v.ID) | .status' test.txt 

peak's answer : 5+) 잔인한의 약간이지만 효과에 JSON 인수를 전달하는 에서 명시 적 형식 변환대안 통과 데이터를 입력 심지어 --argjson v 2$v과 비교할 때인데, 이는 분명히 이고 가장 인 것입니다. 전자 솔루션하지만 설명 필요할 수 있습니다

  • 비록 2는 JSON과 같은 보지 수를, 그 것이다 :이 유형 수의 단일 을 포함하는 유효한 JSON 텍스트입니다 (json.org 참조).

    • 구체적으로 2JSON합니다 (JSON 문자열의 내용에 숫자 -value 당량 "2"이다 만드는 자리로 시작하는 인용되지 않은 토큰이 사실은 이 쉘에서 쉘은 '"2"'으로 전달되어야합니다 - 포함 된 큰 따옴표에 유의하십시오).
  • 따라서 jq 해석 --argjson -v 2, 비교 목적으로 .ID == $v 작품으로 (동일 jq이 값을보기 전에 쉘이 따옴표를 제거 --argjson -v '2'/--argjson -v "2"에 적용 참고).
    대조적으로 --arg으로 전달하는 항목은 항상 문자열 그대로 사용됩니다. 환언

  • : --argjson, 그 목적은 참조로서 그 해석을 강제 번호 문자열을 스칼라를 전달하는데 사용될 수있다 (상술 한 예에서는 '{ "ID": 2 }')를 문자열로 임의 JSON 텍스트를 허용한다.
    동일한 기술은 부울 문자열 truefalse에서도 작동합니다.

그의 도움을 peak에 모자

팁.

3

JSON 값 2을 확인하려는 경우 --arg의 인수를 숫자로 변환하거나 숫자 인수와 함께 --argjson을 사용하도록 선택할 수 있습니다.이러한 대체 방법은 다음과 같이 설명됩니다.

jq --arg v 2 '.jobStatus[] | select(.ID == ($v|tonumber) | .status' 

jq --argjson v 2 '.jobStatus[] | select(.ID == $v) | .status' 

--argjson에는 비교적 최신 버전의 jq가 필요합니다. 당신이 항상 문자열로 처리됩니다 있도록 .ID를 "정상화"할 경우 물론

, 당신은 쓸 수 :

jq --arg v 2 '.jobStatus[] | select((.ID|tostring) == $v) | .status'