Json 在PowerShell中调用ExpandString时如何转义字符串变量

Json 在PowerShell中调用ExpandString时如何转义字符串变量,json,string,powershell,escaping,Json,String,Powershell,Escaping,我有一个PowerShell脚本,可以将JSON文件作为参数并将其转换为对象。在JSON字符串(作为模板)中,可能有一些变量,这些变量应该在运行时替换为实际值。例如,此JSON字符串中的$var_1、$var_x和$var_y: { "key1": "My name is ${var_1}", "key2": { "key3": "Another variable ${var_x}", "key4": "${var_y}" } }

我有一个PowerShell脚本,可以将JSON文件作为参数并将其转换为对象。在JSON字符串(作为模板)中,可能有一些变量,这些变量应该在运行时替换为实际值。例如,此JSON字符串中的
$var_1
$var_x
$var_y

{
    "key1": "My name is ${var_1}",
    "key2":
    {
        "key3": "Another variable ${var_x}",
        "key4": "${var_y}"
    }
}
脚本不知道这些变量的名称。我使用ExpandString来完成这项工作:

[string]$jsonText = Get-Content $inputFile;

if ([string]::IsNullOrWhiteSpace($jsonText)) {
    throw "No content in $inputFile"
}
$temp = $ExecutionContext.InvokeCommand.ExpandString($jsonText);
$jsonObj = ConvertFrom-Json $temp;
问题是,当变量包含双引号时,调用
convertfromjson
将失败,因为引号没有转义。例如,
“我的名字是${var_1}”
可能会变成
“我的名字是一个”新的“名字”


调用ExpandString时有没有办法转义这些字符串变量?

您可以使用以下技术,利用能够通过
$(…)
子表达式操作符将整个语句嵌入模板中的优势;因此,还应注意的是,鉴于可以执行任意命令,您通常应仅对信任的模板字符串使用此技术

$var_1 = '"new" name'

$template = @'
{ "key1": "My name is $((Get-Variable var_1).Value -replace '"', '\"')" }
'@

$ExecutionContext.InvokeCommand.ExpandString($template)
上述收益率:

{ "key1": "My name is \"new\" name" }
这是有效的JSON

请注意使用
Get Variable
间接访问变量
${var_1}
的值,以便根据JSON的要求,将其嵌入的
字符安全地转义为
\”


由于以上内容对于多个引用来说有点麻烦,您可以定义一个辅助函数:

$var_1 = '"new" name'

# Aux. function that takes a variable name and returns its value with
# " chars. \-escaped.
function esc ($varName) { (Get-Variable $varName).Value -replace '"', '\"' }    

# Now you can reference the variables using $(esc <var-name):
$template = @'
{ "key1": "My name is $(esc var_1)" }
'@

$ExecutionContext.InvokeCommand.ExpandString($template)
请注意,模板转换假定:帽子尖到他的输入

  • 输入模板中没有要作为文本处理的转义变量引用(例如,
    `${var}

  • 所有变量引用的形式均为
    ${varName}
    ,其中
    varName
    假定仅由字母、数字和下划线组成(匹配一个或多个
    \w
    实例)


覆盖所有边缘情况的更健壮的解决方案可能需要使用,但这需要付出更多的努力。

这种格式允许吗?如果变量以“
引用,则它是一个字符串,不会将标记添加到
.json
。e、 g:

$var_1 = "Json Sample"
$json_piece = @"
{
    "key1": "My name is $var_1",
    "key2":
    {
        "key3": "Another variable $var_2",
        "key4": "$var_3"
    }
}
"@
It输出($var_2和$var_3未定义):

如果将
添加到json文件,如下所示:

{
    "key1": "My name is "Json Sample"",
    "key2":
    {
        "key3": "Another variable ",
        "key4": ""
    }
}
您将出现一个错误:逗号除外。这意味着如果变量包含
,则必须首先对其进行转义,否则,
.json
文件是意外的


p.S.验证 我在上验证了它。
这是我的密码:

{
  "Key": "value is "value"",
  "key2": "other value"
}
我有两个错误:

  • 根据RFC 4627(JSON规范),JSON输入无效。位置20处出现意外标记v
  • JSON输入在JavaScript中无效,在属性列表后缺少}(在第2行),(在第24位)

关键是,这里类似于
$var_1='“JsonSample”
,因此一旦发生替换,生成的JSON确实会变得无效。他们不知道变量在运行时实际包含的值。如果在
.JSON
文件中使用
,就会出现错误<代码>“必须在传递到
.json
文件之前转义。我刚刚试过。我在答案中添加了验证。也许我有误解,但你似乎在重复问题中提出的问题。嗯,我发现,这个问题的重点是
如何从变量中摆脱双引号@mklement0回答得很好。
{
    "key1": "My name is "Json Sample"",
    "key2":
    {
        "key3": "Another variable ",
        "key4": ""
    }
}
{
  "Key": "value is "value"",
  "key2": "other value"
}