如何在PowerShell的foreach循环中替换占位符并生成正确JSON
问题:PowerShell中循环替换对象属性生成正确JSON字符串
现有包含Name和Age属性的obj对象,需要在foreach循环中替换属性占位符,让函数返回符合预期的JSON字符串。
原函数代码
function Get-JsonFileContent { param( [System.Collections.ArrayList]$objects ) $includeBlocks = [System.Collections.ArrayList]@(); foreach ($obj in $objects) { $include = @" { \"name\": \"$obj.Name\", \"age\": \"$obj.Age\" } "@ $includeBlocks.Add($include); } Write-Host $includeBlocks; return $($includeBlocks -join ","); }
当前输出
{ \"name\": @{Name=John Doe; Age=30}.Name, \"age\": @{Name=John Doe; Age=30}.Age }, { \"name\": @{Name=Jane Doe; Age=40}.Name, \"age\": @{Name=Jane Doe; Age=40}.Age }
期望输出
{ \"name\": \"John Doe\", \"age\": \"30\" }, { \"name\": \"Jane Doe\", \"age\": \"40\" }
解决方法
方法1:修正字符串插值语法
问题出在PowerShell的变量解析逻辑:在Here-String中,$obj.Name会被解析为变量$obj拼接字符串.Name,而非获取$obj的Name属性值。需要用**子表达式$()**包裹属性访问,让PowerShell先计算属性值再插入字符串:
function Get-JsonFileContent { param( [System.Collections.ArrayList]$objects ) $includeBlocks = [System.Collections.ArrayList]@(); foreach ($obj in $objects) { $include = @" { \"name\": \"$($obj.Name)\", \"age\": \"$($obj.Age)\" } "@ $includeBlocks.Add($include); } Write-Host $includeBlocks; return $($includeBlocks -join ","); }
方法2:使用内置ConvertTo-Json(推荐)
手动拼接JSON容易出现转义、格式错误,更可靠的方式是直接将对象转换为JSON:
function Get-JsonFileContent { param( [System.Collections.ArrayList]$objects ) # 将每个对象转换为指定结构的自定义对象,再转JSON $jsonItems = $objects | ForEach-Object { [PSCustomObject]@{ name = $_.Name age = $_.Age } | ConvertTo-Json -Compress:$false } return $jsonItems -join "," }
这种方式无需手动处理转义,PowerShell会自动处理所有JSON格式问题,结果更准确。
内容的提问来源于stack exchange,提问作者sukesh
相关产品推荐
相关产品推荐

