ConvertFrom-Json
將 JSON 格式的字串轉換成自訂物件或哈希表。
語法
Default (預設值)
ConvertFrom-Json
[-InputObject] <String>
[-AsHashtable]
[-Depth <Int32>]
[-NoEnumerate]
[<CommonParameters>]
Description
ConvertFrom-Json Cmdlet 會將 JavaScript 物件表示法 (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 字串,然後使用 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 開始,物件是 OrderedHashtable,並保留 JSON 中的鍵排序。 在舊版中,物件是 Hashtable。
有幾個情境可以克服 ConvertFrom-Json cmdlet 的某些限制。
- 如果沒有此參數,當 JSON 物件中的兩個或多個索引鍵不區分大小寫時,它們會被視為相同的索引鍵。 在此情況下,轉換的物件中只會包含不區分大小寫而相同的索引鍵中的最後一個。
- 若沒有此開關,每當 JSON 包含鍵是空字串時,指令就會擲回錯誤。
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
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 字串中顯示的順序新增。 OrderHashtable 會保留該順序。