json - Powershell & Curl - 在单引号 JSON 正文中使用变量

标签 json powershell curl

我目前正在尝试使用 Powershell 和 Curl 在我们的 Zendesk 票务系统中自动创建新用户。我遇到的问题是 curl json 主体用单引号括起来,我需要在该主体内引用一个变量。这是我所拥有的:

$Firstname = "Test"
$Lastname = "User"
$email= 'user@test.org'   
curl.exe https://mydomain.zendesk.com/api/v2/users.json -H "Content-Type: application/json" -X POST -d '{\"user\": {\"name\": \"$Firstname $Lastname\", \"email\": \"$email\"}}' -v -u myuser:mypass

如果我在 json 中输入常规文本值,这可以正常工作,但是如何让它识别变量 $Firstname、$Lastname 和 $email?

最佳答案

请尝试以下操作:

$Firstname = "Test"
$Lastname = "User"
$email= 'user@test.org'   
$json=@"
{\"user\": {\"name\": \"$Firstname $Lastname\", \"email\": \"$email\"}}
"@
curl.exe https://mydomain.zendesk.com/api/v2/users.json -d $json -H 'Content-Type: application/json' -X POST -v -u myuser:mypass

使用双引号 here-string @"<newline>...<newline>"@使指定嵌入 "实例很容易(不需要为了 PowerShell 自己的语法而进行转义),同时仍然扩展变量引用 - 参见 docs onlineGet-Help about_Quoting_Rules .

您清楚地知道 - 不幸 - 额外需要 \ -逃离"实例 ,但只是为了解释为什么需要这样做:

将参数传递给外部程序 , PowerShell 在它自己的解析和插值之后,在连接它们以形成要传递给外部实用程序的参数列表(单个字符串)时,有条件地将结果参数包装在双引号中。不幸的是,这可能导致嵌入 "实例被丢弃,可靠地保存它们的唯一方法是 \ - 逃离他们 - 见 this answer想要查询更多的信息。

如果你想用一个普通的双引号字符串来内联,你必须转义 " PowerShell 的实例(如 `" ),导致尴尬的组合 \`" :
"{\`"user\`": {\`"name\`": \`"$Firstname $Lastname\`", \`"email\`": \`"$email\`"}}"

事后思考:

瑞安本人在评论中指出 使用哈希表 构建数据,然后使用 将其转换为 JSON ConvertTo-Json 并将其喂给 curl 通过标准输入 的替代方案避免引述头痛 :
# Create data as PS hashtable literal.
$data = @{ user = @{ name = "$Firstname $Lastname"; email = "$adUsername@mydomain.org" } }

# Convert to JSON with ConvertTo-Json and pipe to `curl` via *stdin* (-d '@-')
$data | ConvertTo-Json -Compress | curl.exe mydomain.zendesk.com/api/v2/users.json -d '@-' -H "Content-Type: application/json" -X POST -v -u myuser:mypass

关于json - Powershell & Curl - 在单引号 JSON 正文中使用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36003647/

相关文章:

azure - 使用 Azure Functions/Powershell 应用 PnP 预配模板

php - 如何在内部使用 php restful api-centric 设计而不是 http 请求

java - org.codehaus.jackson.map.exc.UnrecognizedPropertyException : Unrecognized field "id" (Class Criteria), 未标记为可忽略

javascript - 带有一组 JSON 对象的 Backbone.js Bootstrap

python - 如何更改可序列化 python 对象的 json 编码行为?

java - 使用curl POST添加Google Blobstore

powershell - Windows Azure Powershell 部署错误 - "The remote server returned an unexpected response"

string - 从 IPv4 地址的字符串表示中获取特定的八位字节

php - Paypal - Zend_Http_Client_Adapter_Curl - 如何打开 CURLOPT_VERBOSE

C 使用 CURL 获取文件