PowerShell向JSON文件添加新对象不符合预期,求解决方案
问题分析与解决方案
原代码错误点
- 操作对象错误:你用
$json.test | Add-Member给整个数组对象添加属性,而非数组内的单个元素,导致JSON结构混乱。 - 循环逻辑冗余:遍历
$json.test的元素,但未使用循环变量$user,反而重复操作整个数组,且每次循环都写入文件,造成结果覆盖。
修正方案(按预期结果)
假设你的初始JSON文件add.json内容如下:
{ "test": [ { "displayName": "hello", "exceptionName": "hello", "idk": "anymore" } ] }
如果要将原对象拆分为两个独立对象并添加到数组,得到预期结果,可使用以下代码:
$jsonfile = "C:\Users\Public\add.json" # 读取JSON并转换为对象 $json = Get-Content $jsonfile -Raw | ConvertFrom-Json # 获取数组中的原对象 $originalItem = $json.test[0] # 创建新对象,包含指定属性 $newItem = [PSCustomObject]@{ idk = $originalItem.idk yikes = 'if this works' } # 保留原对象的指定属性(移除idk) $json.test[0] = $originalItem | Select-Object displayName, exceptionName # 将新对象添加到数组 $json.test += $newItem # 转换为JSON并写入文件(-Depth 10避免深层属性丢失) $json | ConvertTo-Json -Depth 10 | Set-Content $jsonfile
如果只是需要在test数组中新增一个独立对象,可简化为:
$jsonfile = "C:\Users\Public\add.json" $json = Get-Content $jsonfile -Raw | ConvertFrom-Json # 创建新对象 $newItem = [PSCustomObject]@{ idk = "anymore" yikes = "if this works" } # 添加到数组 $json.test += $newItem # 写入文件 $json | ConvertTo-Json -Depth 10 | Set-Content $jsonfile
关键注意事项
- 使用
-Raw参数读取JSON:Get-Content -Raw可以一次性读取整个文件,避免Out-String的冗余操作。 - 指定
-Depth参数:ConvertTo-Json默认深度为2,复杂对象需要手动指定更高深度,防止属性丢失。 - 操作数组元素而非数组本身:要修改或添加数组内的对象,需直接针对数组的元素(如
$json.test[0])或使用+=新增元素。
内容的提问来源于stack exchange,提问作者jacob furtado
相关产品推荐
相关产品推荐

