PowerShell自定义对象转有效JSON文件输出格式异常如何修复
故障原因
代码存在两处核心错误:
- 层级定位错误:每个
record*节点对应的值是包裹单个业务对象的数组,原代码直接操作外层数组、直接读取数组的contents属性,没有定位到数组内的实际业务对象,导致属性添加位置错误,后续序列化时对象被转成PowerShell原生对象字符串格式。 - 序列化深度不足:PowerShell的
ConvertTo-Jsoncmdlet默认序列化深度仅为2层,你的JSON结构层级(根节点→records→record数组→业务属性对象)超过默认深度限制,深层对象会被强制转换为字符串输出,就是你看到的@{key=value}格式。
修正后可直接运行的代码
$infile = "C:\Temp\input.json" $outfile = "C:\Temp\output.json" $json = Get-Content $infile -Encoding UTF8 | ConvertFrom-Json $records = $json.records $records.PSObject.Properties | ForEach-Object { # 取数组内的实际业务对象,每个record数组仅含1个元素,直接取索引0 $targetEntry = $_.Value[0] # 计算contents字段的字符长度 $contentLength = $targetEntry.contents.Length # 给目标对象新增length属性 $targetEntry | Add-Member -Type NoteProperty -Name 'length' -Value $contentLength } # 指定足够的序列化深度,避免深层对象被转成字符串 $json | ConvertTo-Json -Depth 10 | Out-File $outfile -Encoding UTF8
效果说明
运行后输出的JSON完全符合预期:
length字段被正确添加到每个业务对象中,和locale、category、contents同级- 输出为标准JSON格式,不会出现
@{}格式的PowerShell对象字符串 - 长度计算结果和你给出的预期值完全一致。
内容的提问来源于stack exchange,提问作者Nemo XXX
相关产品推荐
相关产品推荐

