ConvertFrom-Json
将 JSON 格式的字符串转换为自定义对象或哈希表。
语法
Default (默认值)
ConvertFrom-Json
[-InputObject] <String>
[-AsHashtable]
[-Depth <Int32>]
[-NoEnumerate]
[<CommonParameters>]
说明
ConvertFrom-Json cmdlet 将 JavaScript 对象表示法(JSON)格式字符串转换为自定义 PSCustomObject 对象,该对象具有 JSON 字符串中每个字段的属性。 网站通常使用 JSON 来提供对象的文本表示形式。 JSON 标准不禁止使用 PSCustomObject。 例如,如果 JSON 字符串包含重复键,则此 cmdlet 仅使用最后一个键。 请参阅以下示例。
若要从任何对象生成 JSON 字符串,请使用 ConvertTo-Json cmdlet。
PowerShell 3.0 中引入了此 cmdlet。
注释
从 PowerShell 6 开始,此 cmdlet 支持带有注释的 JSON。 接受的注释以两个正斜杠 ()// 开头。 注释不会在数据中表示,可以写入文件中,而不会像在 PowerShell 5.1 中那样损坏数据或引发错误。
示例
示例 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 字符串,然后使用 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,该 cmdlet 会自动将 JSON 内容转换为对象。
示例 3:将 JSON 字符串转换为自定义对象
此示例演示如何使用 ConvertFrom-Json cmdlet 将 JSON 文件转换为 PowerShell 自定义对象。
Get-Content JsonFile.JSON | ConvertFrom-Json
该命令使用 Get-Content cmdlet 获取 JSON 文件中的字符串。 然后,它使用管道运算符将带分隔符的字符串发送到 ConvertFrom-Json cmdlet,该 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 中引入了此开关。 有几个方案可以克服 ConvertFrom-Json cmdlet 的某些限制。
- 如果 JSON 包含一个列表,其键仅在大小写上有所不同。 如果没有开关,这些键将被视为相同的键,因此只有最后一个键会被使用。
- 如果 JSON 包含空字符串的键。 如果没有开关,cmdlet 将引发错误,因为 a
PSCustomObject不允许这样做,但哈希表允许。 可能发生这种情况的一个示例用例是project.lock.json文件。 - 哈希表可以更快地处理某些数据结构。
参数属性
| 类型: | SwitchParameter |
| 默认值: | False |
| 支持通配符: | False |
| 不显示: | False |
参数集
(All)
| Position: | Named |
| 必需: | False |
| 来自管道的值: | False |
| 来自管道的值(按属性名称): | False |
| 来自剩余参数的值: | False |
-Depth
获取或设置允许 JSON 输入的最大深度。 默认情况下,它是 1024。
此参数是在 PowerShell 6.2 中引入的。
参数属性
| 类型: | Int32 |
| 默认值: | None |
| 支持通配符: | False |
| 不显示: | False |
参数集
(All)
| Position: | Named |
| 必需: | False |
| 来自管道的值: | False |
| 来自管道的值(按属性名称): | False |
| 来自剩余参数的值: | False |
-InputObject
指定要转换为 JSON 对象的 JSON 字符串。 输入包含字符串的变量,或键入获取字符串的命令或表达式。 还可以通过管道将字符串传递给 ConvertFrom-Json。
InputObject 参数是必需的,但其值可以是空字符串。 当输入对象为空字符串时,ConvertFrom-Json 不会生成任何输出。
InputObject 值不能 $null。
参数属性
| 类型: | String |
| 默认值: | None |
| 支持通配符: | False |
| 不显示: | False |
参数集
(All)
| Position: | 0 |
| 必需: | True |
| 来自管道的值: | True |
| 来自管道的值(按属性名称): | False |
| 来自剩余参数的值: | False |
-NoEnumerate
指定不枚举输出。
设置此参数会导致数组作为单个对象发送,而不是单独发送每个元素。 这保证了 JSON 可以通过 ConvertTo-Json 进行往返。
参数属性
| 类型: | SwitchParameter |
| 默认值: | False |
| 支持通配符: | False |
| 不显示: | False |
参数集
(All)
| Position: | Named |
| 必需: | False |
| 来自管道的值: | False |
| 来自管道的值(按属性名称): | False |
| 来自剩余参数的值: | False |
CommonParameters
此 cmdlet 支持通用参数:-Debug、-ErrorAction、-ErrorVariable、-InformationAction、-InformationVariable、-OutBuffer、-OutVariable、-PipelineVariable、-ProgressAction、-Verbose、-WarningAction 和 -WarningVariable。 有关详细信息,请参阅 about_CommonParameters。
输入
String
可以通过管道将 JSON 字符串传递给 ConvertFrom-Json。
输出
PSCustomObject
Hashtable
备注
此 cmdlet 是使用 Newtonsoft Json.NET实现的。
从 PowerShell 6 开始,ConvertTo-Json 尝试将格式化为时间戳的字符串转换为 DateTime 值。 转换后的值是一个 [datetime] 实例,其 Kind 属性集如下:
-
Unspecified,如果输入字符串中没有时区信息。 -
Utc,如果时区信息是尾随的Z。 -
Local,如果时区信息以尾随 UTC 时差的形式给出,例如+02:00。 偏移量已正确转换为调用方配置的时区。 默认输出格式不指示原始时区偏移量。