使用文件中的变量通过 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"

请注意,表达式$valuejq不是 shell 变量,而是内部jq变量,其值在命令行上给出,--arg并且自动进行 JSON 编码。

处理数据的一种稍微方便的方法是,将数据单独转换为 JSON 字符串,然后将其传递给将其插入的方法$file,而无需在命令行上扩展数据(如果数据量很大,这会很重要)jq通过进程替换正确的位置:

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

您还可以使用从文件中读取的键值jo来创建data对象,然后使用 shell 变量插入该对象: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.

相关内容