系统学习 Windows 学习路径:从 CMD 到 PowerShell、系统网络,再到 WSL 与 Server

ConvertTo-Json

把 PowerShell 对象序列化成 JSON 字符串,注意深度。

补充说明

ConvertTo-Json 接收对象并输出 JSON 字符串,默认生成带缩进的多行文本,-Compress 生成单行;-Depth 控制递归层数,默认只有 2,超过会被截断并给出警告。它没有内置别名。管道:-InputObject 按值接收对象,也可以直接接在管道末尾。权限:不需要额外权限,输出到文件时由 Set-Content/Out-File 的权限决定。

边界:它只做序列化,不负责编码和文件写入;落盘时显式指定编码。哈希表的键顺序默认不保证,需要稳定顺序用 [ordered]@{} 或 [pscustomobject]。服务端 API 需要的字段名、空值和日期格式要按接口约定处理,不能假定 PowerShell 的默认格式通用。

版本:5.1 把 DateTime 序列化成 \/Date(...)\/,并转义 <、>、&、' 等 HTML 敏感字符;7.x 差异:日期使用 ISO 8601,新增 -AsArray、-EscapeHandling、-EnumsAsStrings。5.1 没有这些参数。

常用示例

# 1. 把单个对象序列化,查看默认多行格式
PS C:\> Get-Process -Id $PID | Select-Object Name, Id, StartTime | ConvertTo-Json

# 2. 明确提高深度,避免嵌套对象被截断
PS C:\> Get-Service | Where-Object Status -eq 'Running' | Select-Object -First 2 Name, Status, ServicesDependedOn | ConvertTo-Json -Depth 3

# 3. 生成单行 JSON,适合日志或命令行传输
PS C:\> [pscustomobject]@{ Name='api'; Port=8080; Tags=@('prod','web') } | ConvertTo-Json -Compress

# 4. 序列化后写文件,显式 UTF-8 避免编码歧义
PS C:\> Get-ChildItem C:\Logs -File | Select-Object Name, Length | ConvertTo-Json -Depth 3 | Set-Content C:\Temp\logs.json -Encoding UTF8

# 5. 强制保留单元素数组,绕过管道展开
PS C:\> ConvertTo-Json -InputObject @(1) -Compress

# 6. 7.x 差异:确保单对象也输出为数组
PS C:\> Get-Process -Name notepad | Select-Object Name, Id | ConvertTo-Json -AsArray

易错点与排错

相关命令

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. 默认深度是多少?超过深度会发生什么?
  2. 为什么只有一个元素的数组经过管道后可能变成对象?
  3. 5.1 和 7.x 对 DateTime 的 JSON 表示有什么差异?
答案
  1. 默认 2;更深层内容被截断,并产生序列化深度警告。
  2. 管道会展开单元素数组,序列化时看到的是单个对象;5.1 用 -InputObject @(...),7.x 用 -AsArray。
  3. 5.1 输出 \/Date(...)\/,7.x 输出 ISO 8601 字符串。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令