JQ를 사용하여 JSON 구문 분석

JQ를 사용하여 JSON 구문 분석

저는 Bash를 사용하여 Linux 시스템에서 다음 스크립트 조각을 실행하고 있습니다.

JSON 파일 콘텐츠:[ { "id": 123456, "firstName": "John", "lastName": "Smith", "email": "[email protected]" } ]


JSON 파일은 ${data[0]}Bash 스크립트로 파이프되는 배열에 저장됩니다.


쿵쿵 스크립트:

trafficEmployeeId=123456 cat "${data[0]}" | jq --arg employeeId $trafficEmployeeId '.[] | select(.id == $employeeId) | .firstName'


스크립트의 출력은 이어야 John하지만 아무것도 얻지 못합니다.

답변1

trafficEmployeeId쉘 변수 를숫자그것은 jq역할을 할 것입니다토론.
해결책은 매개변수를 다음과 같이 구문 분석하는 것입니다.숫자그리고~의tonumber기능.
두 번째는 data[0]객체가 하나만 포함된 배열이므로 직접 사용 .[0]하고 간단한 if연산자 조건을 적용하는 것으로 충분합니다.

완벽한 솔루션:

trafficEmployeeId=123456
echo "${data[0]}" | jq --arg employeeId "$trafficEmployeeId" '.[0] 
      | if .id == ($employeeId | tonumber) then .firstName else empty end'

산출:

"John"

답변2

코드의 주요 문제는 코드를 매개변수로 호출한다는 것입니다 cat. 그러면 이 이름을 가진 파일을 열려고 시도 ${data[0]}하게 됩니다 . cat이것은 아마도 "JSON 파일이 배열에 저장되어 있다 ${data[0]}"는 의미일 것입니다. 그러나 이것이 의미하는 경우 파일은 다음과 같습니다.문자 그대로printf배열 에 저장된 경우 jq.

$employeeId숫자(JSON 문서의)를 문자열(표현식 의 값 ) 과 비교하려고 하면 jq추가 문제가 있습니다 . 이 문제는 대신 를 사용하면 --argjson쉽게 해결할 수 있습니다 --arg. 를 사용하면 생성한 변수의 값이 이미 적절하게 JSON으로 인코딩된 것으로 가정합니다 --argjson.jq

수정된 스크립트는 다음과 같습니다.

#!/bin/sh

id=123456
jq --argjson id "$id" '.[] | select(.id == $id).firstName' file.json

또는 다음 값을 사용하려는 경우 ${data[0]}:

#!/bin/bash

# other code here setting data[0] to some JSON document data.

id=123456

printf '%s\n' "${data[0]}" |
jq --argjson id "$id" '.[] | select(.id == $id).firstName'

쿼리가 사용자 입력이나 다른 외부 프로세스에서 오는 경우 표현식과 비교하기 위해 문서의 값을 문자열로 계속 사용하고 변환하는 것이 id더 안전할 수 있습니다 .--argselect()

jq --arg id "$id" '.[] | select((.id|tostring) == $id).firstName'

관련 정보