无法将文件中的多个值分配给 json 请求

Posted

技术标签:

【中文标题】无法将文件中的多个值分配给 json 请求【英文标题】:Unable to assign multiple values from a file to a json request 【发布时间】:2022-01-19 17:02:31 【问题描述】:

我有一个带有这条测试线的简单文件:

mmm@gmail.com 31460 147557432

我的目标是作为 json 数据发送。

在我的 while 循环中,我可以在代码示例的第二行中回显变量。

但是,当我尝试将它们分配给 jsonstring 和 echo 时,不会填充这些值。

我需要做什么才能将这些值传递给我的 json 字符串?

while read emailvar idvar expirevar; do
    echo "$emailvar:$expirevar:$idvar"
    jsonstring=$idvar $emailvar $expirevar
    echo "$jsonstring"      
#jsonstring='"user_id":"$idvar","email":"$emailvar","custom_attributes":"Program_Expires_at":"$expirevar"'
done < "tempdata.txt"

【问题讨论】:

【参考方案1】:
#!/bin/bash

while read line;
do
    line_array=($line)
    emailvar=$line_array[0]
    expirevar=$line_array[1]
    idvar=$line_array[2]
    jsonstring='"user_id": "'$idvar'", "email": "'$emailvar'", "custom_attributes":"Program_Expires_at": "'$expirevar'"'
    echo $jsonstring

done < 'tempdata.txt'

输出:

【讨论】:

【参考方案2】:

您必须对空格进行转义以使其成为字符串的一部分,而不是创建一个带有一些命令前分配的简单命令。

jsonstring=$idvar\ $emailvar\ $expirevar

通常写成

jsonstring="$idvar $emailvar $expirevar"

在您的注释分配中,您使用了 引号,这可以防止参数扩展。您需要使用双引号,这需要手动转义内部双引号。不过,更强大的是使用像 jq 这样的工具为您生成 JSON:它会负责转义变量中的任何字符以生成有效的 JSON。

jsonstring=$(jq -n \
                --arg id "$idvar" \
                --arg email "$emailvar" \
                --arg expire "$expirevar" \
     'user_id: $id,
       email: $email,
       custom_attributes: Program_Expires_at: $expire'
)

【讨论】:

【参考方案3】:

这似乎本质上是 bash 如何处理变量和参数扩展的问题。我相信这里的解决方案基本上是添加一堆双引号。

双引号可用于启用多个变量的参数扩展。对于此 bash 脚本中的 JSON 输出,我们需要使用嵌套的双引号。

要解决这个问题,我们可以:

jsonstring 的值周围加上双引号 (") 在jsonstring\ 的值中使用的字符串周围的双引号转义

如果您希望将 $idvar$expirevar 解释为数字而不是字符串,则不需要在这些值周围使用转义的双引号。

例如:

#!/bin/bash

while read emailvar idvar expirevar; do
    jsonstring="\"user_id\":$idvar,\"email\":\"$emailvar\",\"custom_attributes\":\"Program_Expires_at\":$expirevar"
    echo "$jsonstring"
done < "tempdata.txt"

示例输出:

user@pc: bash ./script.sh
"user_id":31460,"email":"mmm@gmail.com","custom_attributes":"Program_Expires_at":147557432

user@pc: bash ./script.sh | jq .

  "user_id": 31460,
  "email": "mmm@gmail.com",
  "custom_attributes": 
    "Program_Expires_at": 147557432
  

【讨论】:

以上是关于无法将文件中的多个值分配给 json 请求的主要内容,如果未能解决你的问题,请参考以下文章

如何等待module.export函数完成请求,然后再将其返回值分配给不同JS文件中的变量[重复]

HTTP 请求为 params 中的键分配多个值

有啥方法可以将变量分配给 axios 请求并在 onUploadProgress 中访问它

无法将值类型“()”分配给字符串类型?

无法将音频源分配给源标签以响应 ajax 请求

错误:无法将“[String]”类型的值分配给 swift 中的“String”类型