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呼び出し」セクション。