ファイルの変数を使用してJSONを介してデータをプッシュする

ファイルの変数を使用してJSONを介してデータをプッシュする

現在、JSON構造を必要とするAPIを介してデータをプッシュする際に問題が発生しました。次のように作成したファイルから値を読み取る必要があります。

file="/value"
name=$(cat "$file")

したがって、$ nameは値ファイル内のコンテンツの変数であり、うまく機能します。データをプッシュする必要があるときに問題が発生します。

cos -u https://myapi.com push data '{
  "sec": 0,
  "usage": 0,
  "actions": [
    {
      "name": "transfer",
      "data": {
        "from": "test",
        "to": "test2",
        "value": $name,
        "message": ""
  },

「値」オブジェクトの名前を読み取る変数をどのように定義しますか?

答え1

ファイルのデータを生の文字列として扱う必要があると仮定すると、JSONでエンコードする必要があります。これは、次のようにJSONを理解するプログラムを使用して最も簡単に実行できますjq

json='
{
   "actions": [
      {
         "data": { "from": "test", "message": "", "to": "test2" },
         "name": "transfer"
      }
   ],
   "sec": 0,
   "usage": 0
}
'

json=$( jq --arg value "$(cat "$file")" '.actions[0].data.value = $value' <<<"$json" )

cos -u 'https://myapi.com' push data "$json"

$value式にはjqシェル変数はありませんが、値jqがコマンドラインに提供され、--arg自動的にJSONにエンコードされる内部変数があります。

データを処理するより便利な方法は、$fileコマンドラインからデータを拡張せずに(データが大きい場合は重要かもしれません)、データを個別にJSON文字列に変換してそれを挿入するjqメソッドに渡すことです。プロセス別の正しい場所:

jq '.actions[0].data.value = input' - <( jq -Rs . data ) <<<"$json"

ファイルから読み取ったキー値でオブジェクトをjo作成し、dataシェル変数を使用してオブジェクトを挿入することもできます。value$file

datajson=$( jo from=test message="" to="test2" value=@"$file" )

json='
{
   "actions": [
      {
         "data": '"$datajson"',
         "name": "transfer"
      }
   ],
   "sec": 0,
   "usage": 0
}
'

cos -u 'https://myapi.com' push data "$json"

挿入用にJSON文書を構成する一重引用符文字列を一時的に区切る方法に注意してください$datajson

関連情報