我目前陷入尝试通过需要 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
不是 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
.