json 파일을 읽고 그 출력을 사용하여 jq
위의 json 파일과 다른 값을 결합하여 다른 json을 빌드하고 전달하려고 합니다.CURL
나는 다음을 사용하여 파일을 읽었습니다.policies=$( sed 's/\\//g' policies.json)
jq
다음 명령을 사용하여 새 json을 빌드합니다.
BODY=$( jq -n \
--arg cid "$chaincodeId" \
--arg cv "$chaincodeV" \
--arg ct "$chaincodeT" \
--arg ar "$chaincodeArgs" \
--arg pol "$policies" \
'{chaincode_id: $cid, chaincode_version: $cv, chaincode_type: $ct, endorsement_policy: $pol}' )
처음 4개 속성에서는 잘 작동합니다. 그러나 endorsement_policy 속성에는 백슬래시가 포함되어 있으므로 서버는 컬을 통해 전송된 속성을 읽을 수 없습니다.
본문의 출력은 다음과 같습니다
{ "chaincode_id": "IdentityManager", "chaincode_version": "testcc2", "chaincode_type": "node", "endorsement_policy": "{\n \"identities\": [\n {\n \"role\": {\n \"name\": \"member\",\n \"mspId\": \"org1\"\n }\n },\n {\n \"role\": {\n \"name\": \"member\",\n \"mspId\": \"org2\"\n }\n },\n {\n \"role\": {\n \"name\": \"member\",\n \"mspId\": \"org3\"\n }\n }\n ],\n \"policy\": {\n \"1-of\": [\n {\n \"signed-by\": 0\n },\n {\n \"signed-by\": 1\n },\n {\n \"signed-by\": 2\n }\n ]\n }\n}" }
jq가 백슬래시를 생성하지 않도록 강제하는 방법을 이해할 수 없습니다. 설명서에 변수를 문자열로 처리한다고 명시되어 있기 때문입니다. 누구든지 나에게 해결책에 대한 힌트를 줄 수 있습니까?
답변1
다음 을 사용하여 변수 --arg
에 데이터를 전달할 때jq
끈. 이런 방식으로 JSON 조각을 전달하면 jq
이스케이프해야 하는 문자열의 비트가 자연스럽게 이스케이프되어 유효한 JSON 인코딩 문자열이 됩니다.
텍스트 문자열이 아닌 JSON으로 사용하려는 JSON 조각을 전달하는 경우 --argjson
대신 --arg
.
간단히 말해서, 사용해야 할 것 같습니다.
BODY=$( jq -n \
--arg cid "$chaincodeId" \
--arg cv "$chaincodeV" \
--arg ct "$chaincodeT" \
--arg ar "$chaincodeArgs" \
--argjson pol "$policies" \
'{chaincode_id: $cid, chaincode_version: $cv, chaincode_type: $ct, endorsement_policy: $pol}' )
또한 원본 policies.json
파일이 올바르게 인코딩된 JSON 파일인 경우백슬래시를 제거하면 안 됩니다..
policies.json
문서에 직접 삽입 하려면 다음을 수행하십시오.가능한사용
BODY=$( jq -n \
--arg cid "$chaincodeId" \
--arg cv "$chaincodeV" \
--arg ct "$chaincodeT" \
--arg ar "$chaincodeArgs" \
--slurpfile pol policies.json \
'{chaincode_id: $cid, chaincode_version: $cv, chaincode_type: $ct, endorsement_policy: $pol[] }' )
(참고 $pol[]
), 하지만 자주 사용하지 않기 때문에 어떤 상황에서 충돌이 발생하는지 100% 확신할 수 없습니다.
당신은 또한 볼 수 있습니다jq
매뉴얼의 "jq 호출" 섹션.