Linux Shell - 使用 sed 读取 json 时如何删除 JQ 生成的转义字符?

Linux Shell - 使用 sed 读取 json 时如何删除 JQ 生成的转义字符?

我正在尝试读取一个 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”部分

相关内容