如何用PowerShell修改JSON非字符串值?解决布尔值转字符串问题
解决PowerShell修改JSON时布尔值被序列化为字符串的问题
问题场景
现有appsettings.json配置文件内容如下:
{"ApiSettings": {"EnableSwagger": true,"UrlListeners": ["http://localhost:9000"],"DebugMode": true}}
编写PowerShell脚本时,尝试将DebugMode设为false,但生成的JSON中该值变成带引号的字符串"false",而非预期的布尔值false,同时需要修改UrlListeners部分。
解决方案
核心要点是使用PowerShell原生的布尔类型值(而非字符串),并正确处理JSON的序列化/反序列化流程:
完整脚本示例
# 1. 读取JSON文件并转换为PowerShell对象 $configPath = ".\appsettings.json" $config = Get-Content -Path $configPath -Raw | ConvertFrom-Json # 2. 修改UrlListeners(示例:替换为新的监听地址数组) $config.ApiSettings.UrlListeners = @("http://localhost:8080", "https://api.example.com") # 3. 修改DebugMode为布尔值false(注意不要加引号) $config.ApiSettings.DebugMode = $false # 4. 将修改后的对象转换回JSON并写入文件 # -Depth参数确保嵌套结构完整序列化,避免默认深度不足导致的截断 $config | ConvertTo-Json -Depth 10 | Set-Content -Path $configPath -Encoding UTF8
关键说明
- 避免使用字符串赋值:如果写成
$config.ApiSettings.DebugMode = "false",ConvertTo-Json会将其识别为字符串类型,最终生成带引号的"false";而使用PowerShell原生的$false(布尔值),序列化后会得到JSON标准的布尔值false。 -Depth参数:默认ConvertTo-Json的深度为2,若配置文件嵌套层级较深,需指定足够大的深度值(如10),防止嵌套对象被截断为{}。
内容的提问来源于stack exchange,提问作者user182595
相关产品推荐
相关产品推荐

