JSON 序列化与反序列化
ConvertTo-Json 把对象序列化成 JSON,ConvertFrom-Json 把 JSON 文本还原成对象。调用接口、读写配置、与外部程序交换结构化数据时几乎必用。要特别注意默认的深度限制:嵌套层数超过限制会被静默截断成字符串。
基本信息
| 适用平台 | Windows PowerShell 5.1 与 PowerShell 7 |
|---|---|
| 序列化 | <对象> | ConvertTo-Json -Depth 5 |
| 反序列化 | Get-Content 文件 -Raw | ConvertFrom-Json |
| 深度限制 | 默认 2,嵌套结构需按需加大 |
| 读取建议 | 用 -Raw 整体读入再解析,避免按行拆分破坏结构 |
| 编码表现 | 5.1 会把中文转义成编码序列,程序可正确解析但人读不友好 |
典型使用场景
- 调用接口后解析返回内容,提取需要的字段
- 读取配置文件并把其中的值传给脚本
- 把对象导出成 JSON 交给其他系统消费
- 与外部工具交换数据,避免自定义文本格式带来的解析歧义
- 调试时把对象打印成 JSON,看清嵌套结构
常用示例
常用示例
# 对象转 JSON,注意深度
Get-Process -Id 4 | Select-Object Name, Id | ConvertTo-Json
Get-CimInstance Win32_OperatingSystem | Select-Object Caption, Version, OSArchitecture | ConvertTo-Json -Depth 3
# 读取 JSON 文件并取值,用 -Raw 整体解析
$cfg = Get-Content D:\cfg.json -Raw | ConvertFrom-Json
$cfg.Port
# 逐项处理解析出来的集合
(Get-Content D:\list.json -Raw | ConvertFrom-Json) | ForEach-Object { $_.Name }
# 写回文件时显式指定编码
$cfg | ConvertTo-Json -Depth 5 | Set-Content D:\cfg.out.json -Encoding UTF8参数与影响
| 参数 | 作用 | 注意 |
|---|---|---|
| -Depth | 序列化嵌套的最大深度 | 超出会被截断成字符串形式 |
| -Compress | 输出紧凑的单行 JSON | 便于传输,不便阅读 |
| -AsArray | 结果始终为数组 | PowerShell 7 及以上可用 |
| -Raw | 读取时整体读入再解析 | 避免按行拆分破坏结构 |
| -Encoding | 写入文件时的编码 | 中文场景要显式指定 |
读取 JSON 文件时建议加 -Raw 整体读入再解析。按行读取会把内容拆成多行数组,结构被破坏后解析会失败或得到错误结果。
嵌套层数超过深度限制时不会报错,而是被静默转成字符串形式,问题往往在上层调用时才暴露。排查数据结构异常时先检查这个参数。