【问题标题】:curl PUT with variables containing JSON data带有包含 JSON 数据的变量的 curl PUT
【发布时间】:2019-12-04 19:38:33
【问题描述】:

我想使用 curl 来 PUT 数据。这有效:

curl -X PUT --data '{ "xy": [0.6476, 0.2727] }' "http://"

我想用几个 bash 变量来代替文字:

$key="xy"
$value="[0.6476, 0.2727]"

我尝试用带引号的变量替换文字,但出现错误“参数不可用”。我已经尝试过嵌套和转义引号的组合,但我没有得到任何结果。

【问题讨论】:

  • 另请参阅this question,了解如何从 Bash 变量构建 JSON 对象。
  • 我尝试使用 jq 来构建 JSON,但我无法让它与数组(值)一起使用。 -arg 对键有效,但对值无效。我尝试了 -argjson 并拒绝了它。
  • 可能是like this
  • stackoverflow.com/questions/59153051/…;它使用jq 1.6 中的一个新功能来访问jq 的位置参数作为列表。
  • 谢谢你们。我怀疑我的问题来自命令链的更上层(如何将值分配给数组变量,这并不像我展示的那样明确)但我被curl 中的失败转移了注意力

标签: json bash curl


【解决方案1】:

这对我有用 Node:

key="xy"
value="[0.6476, 0.2727]"
jsonData=$(node -e "console.log(JSON.stringify({$key: $value}))")
#jsonData output is: {"xy":[0.6476,0.2727]}

curl -X PUT --data $jsonData "http://"

但这仅适用于 Node.js Developer 或者您已安装 Node 环境。

【讨论】:

    【解决方案2】:

    这对我有用:

     $ key='foo' 
     $ value='[ bar, bar ]' 
     $ echo "{ \"$key\": $value }"
     { "foo": [ bar, bar ] }
    

    所以这也应该适合你:

    curl -X PUT --data "{ \"$key\": $value }" "http://google.com.uy"
    

    如果有帮助请告诉我!

    【讨论】:

    • 谢谢。它现在确实有效。我以为我已经尝试过这种组合,但显然没有!
    • 这是个坏主意。它假定 keyvalue 都不包含任何需要在有效 JSON 值中引用的字符。
    【解决方案3】:

    使用jq(1.6 或更高版本),使用--jsonargs 选项将多个 JSON 编码的值作为一个 JSON 数组,可通过$ARGS.positional 访问:

    $ key=xy
    $ value=(0.6476 0.2727)
    $ jq -n '{($k): $ARGS.positional}' --arg k "$key" --jsonargs "${value[@]}"
    {
      "xy": [
        0.6476,
        0.2727
      ]
    }
    

    --jsonargs 必须排在最后,以便所有剩余的参数都被视为所需数组中的值。我们使用--jsonargs 而不是--args,这样您就可以得到一个浮点值数组,而不是字符串数组。

    jq 工作后,将其输出通过管道传输到 curl,它使用 - 作为 --data 的参数来从管道中读取数据。

    jq -n '{($k): $ARGS.positional}' --arg k "$key" --jsonargs "${value[@]}" |
       curl -X PUT --data - "http://"
    

    【讨论】:

    • 你能解释一下吗?它看起来正是我所追求的,但我不太确定 '{($k): $ARGS.positional}' 在做什么。
    • 括号是强制$k 被评估为一个表达式,而不是一个格式错误的文字键。 $ARGS.positional 是一个表达式,其计算结果为一个数组,其中包含--args 选项后面的所有参数。
    • 我的value 设置为包含我需要发送的数组的字符串(根据我的问题),所以我的 jsonargs 部分是--jsonargs "[nnn, nnn]",它正在输出[[nnn nnn]]。请问我怎样才能摆脱那对额外的方括号?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多