ConvertFrom-Json

将 JSON 格式的字符串转换为自定义对象或哈希表。

语法

ConvertFrom-Json
                [-InputObject] <String>
                [-AsHashtable]
                [-DateKind <JsonDateKind>]
                [-Depth <Int32>]
                [-NoEnumerate]
                [<CommonParameters>]

说明

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

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

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

此 cmdlet 是在 PowerShell 3.0 中引入的。

注意

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

示例

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

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

Get-Date | Select-Object -Property * | ConvertTo-Json | ConvertFrom-Json

DisplayHint : 2
DateTime    : Monday, January 29, 2024 3:10:26 PM
Date        : 1/29/2024 12:00:00 AM
Day         : 29
DayOfWeek   : 1
DayOfYear   : 29
Hour        : 15
Kind        : 2
Millisecond : 931
Microsecond : 47
Nanosecond  : 600
Minute      : 10
Month       : 1
Second      : 26
Ticks       : 638421378269310476
TimeOfDay   : @{Ticks=546269310476; Days=0; Hours=15; Milliseconds=931; Microseconds=47;
              Nanoseconds=600; Minutes=10; Seconds=26; TotalDays=0.632256146384259;
              TotalHours=15.1741475132222; TotalMilliseconds=54626931.0476;
              TotalMicroseconds=54626931047.6; TotalNanoseconds=54626931047600;
              TotalMinutes=910.448850793333; TotalSeconds=54626.9310476}
Year        : 2024

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

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

此命令使用 Invoke-WebRequest cmdlet 从 Web 服务获取 JSON 字符串,然后使用 ConvertFrom-Json cmdlet 将 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,它会自动将 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 开始,对象是 OrderHashtable,并保留 JSON 中的键排序。 在早期版本中,该对象是 Hashtable

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

  • 如果没有此开关,当 JSON 对象中的两个或多个键在不区分大小的情况下相同时,它们将被视为相同的键。 在这种情况下,转换后的对象将仅包含最后一个不区分大小写的相同键。
  • 如果没有此开关,只要 JSON 包含空字符串键,cmdlet 就会引发错误。 PSCustomObject 的属性名称不能为空字符串。 例如,这可能发生在 project.lock.json 文件中。
  • 哈希表可以更快地处理某些数据结构。
类型:SwitchParameter
Position:Named
默认值:False
必需:False
接受管道输入:False
接受通配符:False

-DateKind

指定在 JSON 字符串中分析日期时间值时使用的方法。 此参数的可接受值为:

  • Default
  • Local
  • Utc
  • Offset
  • String

有关这些值如何影响转换的信息,请参阅 NOTES的详细信息。

此参数是在 PowerShell 7.5 中引入的。

类型:Microsoft.PowerShell.Commands.JsonDateKind
接受的值:Default, Local, Utc, Offset, String
Position:Named
默认值:Default
必需:False
接受管道输入:False
接受通配符:False

-Depth

获取或设置允许 JSON 输入具有的最大深度。 默认值为 1024。

此参数是在 PowerShell 6.2 中引入的。

类型:Int32
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-InputObject

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

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

类型:String
Position:0
默认值:None
必需:True
接受管道输入:True
接受通配符:False

-NoEnumerate

指定未枚举的输出。

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

类型:SwitchParameter
Position:Named
默认值:False
必需:False
接受管道输入:False
接受通配符:False

输入

String

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

输出

PSCustomObject

OrderedHashtable

备注

此 cmdlet 是使用 Newtonsoft Json.NET 实施的。

从 PowerShell 6 开始,ConvertTo-Json 尝试将时间戳格式的字符串转换为 DateTime 值。

PowerShell 7.5 添加了 DateKind 参数,可用于控制时间戳字符串的转换方式。 参数接受以下值:

  • Default - 根据以下规则将时间戳转换为 [datetime] 实例:
    • 如果输入字符串中没有时区信息,则 Json.NET 序列化程序会将该值转换为未指定的时间值。
    • 如果时区信息为尾随 Z,则 Json.NET 序列化程序会将时间戳转换为 UTC 值。
    • 如果时间戳包含 UTC 偏移量, +02:00则偏移量将转换为调用方配置的时区。 默认输出格式不指示原始时区偏移量。
  • Local- 在本地时间将时间戳转换为[datetime]实例。 如果时间戳包含 UTC 偏移量,则偏移量将转换为调用方配置的时区。 默认输出格式不指示原始时区偏移量。
  • Utc - 以 UTC 时间将值 [datetime] 转换为实例。
  • Offset - 将时间戳转换为 [DateTimeOffset] 实例,该实例中保留的原始字符串的时区偏移量。 如果原始字符串不包含时区偏移量, 则会在本地时区中指定 DateTimeOffset 值。
  • String - 保留实例的值 [string] 。 这可确保任何自定义分析逻辑都可以应用于原始字符串值。

PSObject 类型维护 JSON 字符串中显示的属性顺序。 从 PowerShell 7.3 开始,AsHashtable 参数将创建 OrderedHashtable。 键值对按 JSON 字符串中显示的顺序添加。 OrderHashtable 保留该顺序。