PowerShell JSON互转格式不符问题咨询
解决PowerShell ConvertTo-Json适配REST请求的格式问题
嘿,我之前对接REST API时也踩过ConvertTo-Json的坑,它默认的序列化行为有时候确实会和API预期的格式对不上,咱们一步步来搞定你的问题。
首先先拆解下你的原始JSON结构:外层是property-content数组,里面的对象包含数组类型的timestamps、values,还有两个空字符串属性。常见的问题点和解决方法如下:
1. 核心问题:默认序列化深度不够
PowerShell的ConvertFrom-Json会把JSON转成PSCustomObject,但ConvertTo-Json默认的序列化深度只有2层。如果你的修改操作让对象嵌套变深(哪怕只是在数组里加元素),就可能导致结构被截断,输出不符合预期。
解决方法:序列化时一定要指定足够大的-Depth参数,比如-Depth 10(根据你的实际嵌套层级调整,只要比实际层级大就行)。
2. 完整操作示例
下面是从解析到修改再到序列化的完整代码,完全贴合你的场景:
# 原始JSON字符串 $originalJson = '{ "property-content": [ { "statKey": "Test|Test1", "timestamps": [1522678260000], "values": ["compliant"], "others": "", "otherAttributes": "" } ] }' # 解析为PSCustomObject $jsonObject = $originalJson | ConvertFrom-Json # 修改你需要的属性值(示例:更新statKey,添加新的时间戳) $jsonObject.'property-content'[0].statKey = "Test|UpdatedTest" $jsonObject.'property-content'[0].timestamps += 1522764660000 # 关键:指定深度序列化,确保结构完整 # -Compress:$false 生成格式化的JSON方便调试,需要压缩的话改成 -Compress $finalJson = $jsonObject | ConvertTo-Json -Depth 10 -Compress:$false
执行后输出的JSON格式会和原始结构完全一致,符合REST请求的要求:
{ "property-content": [ { "statKey": "Test|UpdatedTest", "timestamps": [ 1522678260000, 1522764660000 ], "values": [ "compliant" ], "others": "", "otherAttributes": "" } ] }
3. 额外注意事项
- 空字符串不要转为null:如果修改时不小心把
others或otherAttributes设为$null,序列化后会变成null而不是"",一定要显式赋值为空字符串:$jsonObject.'property-content'[0].others = "" - 保持类型一致性:比如
timestamps是数字数组,添加元素时要确保是数字类型,别写成字符串(比如1522764660000而不是"1522764660000"),否则序列化后会变成字符串数组,不符合API预期。 - 属性大小写保留:PowerShell会保留原始属性名的大小写,所以直接用
$jsonObject.'property-content'这种方式访问,别改成驼峰或其他格式。
内容的提问来源于stack exchange,提问作者Kevin Brüsch
相关产品推荐
相关产品推荐

