cmdlet ConvertFrom-Json 将 Json (Json 对象表示法) 格式化字符串转换为自定义 PSObject Hashtable 对象,该对象具有 JSON 字符串中每个字段的属性。 JSON 通常可供网站使用,以提供对象的文本表示形式。 cmdlet 在处理 JSON 字符串的每一行时将属性添加到新对象。

JSON 标准允许重复的键名称,这些名称在 PSObject 结束 哈希表 类型中是禁止的。 例如,如果 JSON 字符串包含重复键,则此 cmdlet 仅使用最后一个键。 请参阅下面的其他示例。

若要从任何对象生成 JSON 字符串,请使用 ConvertTo-Json cmdlet。

此 cmdlet 是在 PowerShell 3.0 中引入的。

从 PowerShell 6 开始,cmdlet 支持包含注释的 JSON。 JSON 注释以两个正斜杠开头, ( // ) 字符。 cmdlet 不会在对象输出中捕获 JSON 注释。 在 PowerShell 6 之前, ConvertFrom-Json 遇到 JSON 注释时会返回错误。

示例 1:将 DateTime 对象转换为 JSON 对象

此命令使用 ConvertTo-Json ConvertFrom-Json cmdlet 将 DateTime 对象从 Get-Date cmdlet 转换为 JSON 对象,然后转换为 PSCustomObject

Get-Date | Select-Object -Property * | ConvertTo-Json | ConvertFrom-Json
DisplayHint : 2
DateTime    : Friday, January 13, 2012 8:06:31 PM
Date        : 1/13/2012 8:00:00 AM
Day         : 13
DayOfWeek   : 5
DayOfYear   : 13
Hour        : 20
Kind        : 2
Millisecond : 400
Minute      : 6
Month       : 1
Second      : 31
Ticks       : 634620819914009002
TimeOfDay   : @{Ticks=723914009002; Days=0; Hours=20; Milliseconds=400; Minutes=6; Seconds=31; TotalDays=0.83786343634490734; TotalHours=20.108722472277776; TotalMilliseconds=72391400.900200009; TotalMinutes=1206.5233483366667;TotalSeconds=72391.4009002}
Year        : 2012

该示例使用 Select-Object cmdlet 获取 DateTime 对象的所有属性。 它使用 ConvertTo-Json cmdlet 将 DateTime 对象转换为格式化为 JSON 对象的字符串, ConvertFrom-Json 使用 cmdlet 将 JSON 格式的字符串转换为 PSCustomObject 对象。

示例 2:从 Web 服务获取 JSON 字符串并将其转换为 PowerShell 对象

此命令使用 Invoke-WebRequest cmdlet 从 Web 服务获取 JSON 字符串,然后使用 cmdlet 将 ConvertFrom-Json JSON 内容转换为可在 PowerShell 中管理的对象。

# Ensures that Invoke-WebRequest uses TLS 1.2
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$j = Invoke-WebRequest 'https://api.github.com/repos/PowerShell/PowerShell/issues' | ConvertFrom-Json

还可以使用 Invoke-RestMethod cmdlet,该 cmdlet 会自动将 JSON 内容转换为 对象。

示例 3:将 JSON 字符串转换为自定义对象

此示例演示如何使用 ConvertFrom-Json cmdlet 将 JSON 文件转换为 PowerShell 自定义对象。

Get-Content -Raw JsonFile.JSON | ConvertFrom-Json

该命令使用 Get-Content cmdlet 获取 JSON 文件中的字符串。 Raw 参数将整个文件作为单个 JSON 对象返回。 然后,它使用管道运算符将带分隔符的字符串 ConvertFrom-Json 发送到 cmdlet,后者将其转换为自定义对象。

示例 4:将 JSON 字符串转换为哈希表

此命令显示了一个示例, -AsHashtable 其中开关可以克服命令的限制。

'{ "key":"value1", "Key":"value2" }' | ConvertFrom-Json -AsHashtable

JSON 字符串包含两个键值对,其键仅在大小写上不同。 如果没有 开关,该命令将引发错误。

示例 5:往返单个元素数组

此命令显示了一个示例, -NoEnumerate 其中 开关用于往返单个元素 JSON 数组。

Write-Output "With -NoEnumerate: $('[1]' | ConvertFrom-Json -NoEnumerate | ConvertTo-Json -Compress)"
Write-Output "Without -NoEnumerate: $('[1]' | ConvertFrom-Json | ConvertTo-Json -Compress)"
With -NoEnumerate: [1]
Without -NoEnumerate: 1

JSON 字符串包含具有单个元素的数组。 如果不使用 开关,则将 JSON 转换为 PSObject,然后使用 命令将其转换回 ConvertTo-Json 一个整数。

-AsHashtable

将 JSON 转换为哈希表对象。 PowerShell 6.0 中引入了此开关。 从 PowerShell 7.3 开始, 对象为 OrderedHashtable ,并保留 JSON 中键的顺序。 在以前的版本中, 对象是 哈希表

在几种情况下,它可以克服 cmdlet 的某些 ConvertFrom-Json 限制。

  • 如果没有此开关,当 JSON 对象中的两个或多个键不区分大小写时,它们将被视为相同的键。 在这种情况下,转换的对象中只有最后一个不区分大小写的相同键。
  • 如果没有此开关,只要 JSON 包含一个为空字符串的键,cmdlet 将引发错误。 PSCustomObject 不能具有空字符串的属性名称。 例如,这可能发生在 project.lock.json 文件中。
  • 对于某些数据结构,可以更快地处理哈希表。
  • -InputObject

    指定要转换为 JSON 对象的 JSON 字符串。 输入一个包含字符串的变量,或键入可获取字符串的命令或表达式。 还可以通过管道将字符串传递给 ConvertFrom-Json

    InputObject 参数是必需的,但其值可以是空字符串。 当输入对象为空字符串时, ConvertFrom-Json 不会生成任何输出。 InputObject 值不能是 $null

    Type: String Position:0 Default value:None Accept pipeline input:True Accept wildcard characters:False

    -NoEnumerate

    指定不枚举输出。

    设置此参数会导致数组作为单个对象发送,而不是单独发送每个元素。 这可以保证 JSON 可以通过 进行舍入 ConvertTo-Json

    Type: SwitchParameter Position:Named Default value:False Accept pipeline input:False Accept wildcard characters:False

    String

    可以通过管道将 JSON 字符串传递给 ConvertFrom-Json

    PSCustomObject

    OrderedHashtable

    此 cmdlet 是使用 Newtonsoft Json.NET 实现的

    从 PowerShell 6 开始, ConvertTo-Json 尝试将格式化为时间戳的字符串转换为 DateTime 值。 转换后的值是一个 [datetime] 实例,其 Kind 属性集如下:

  • Unspecified 如果输入字符串中没有时区信息,则为 。
  • Utc 如果时区信息为尾随 Z ,则为 。
  • Local 如果时区信息作为尾随 UTC 偏移量 提供,则为 ,例如 +02:00 。 偏移量正确转换为调用方配置的时区。 默认输出格式不指示原始时区偏移量。
  • PSObject 类型维护 JSON 字符串中所示的属性顺序。 从 PowerShell 7.3 开始, AsHashtable 参数创建 OrderedHashtable 。 键值对按 JSON 字符串中显示的顺序添加。 OrderedHashtable 保留该顺序。

  • JavaScript 和 .NET 中的 JavaScript 对象表示法 (JSON) 简介
  • ConvertTo-Json
  • Invoke-WebRequest
  • Invoke-RestMethod
  •