我正在尝试读取一个 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 属性包含反斜杠,因此服务器无法读取通过curl 发送的属性。
body 的输出如下
{ "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”部分。