Dela via


ConvertFrom-Json

Konverterar en JSON-formaterad sträng till ett anpassat objekt eller en hash-tabell.

Syntax

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

Description

Cmdleten ConvertFrom-Json konverterar en JSON-formaterad sträng (JavaScript Object Notation) till en anpassad PSObject- eller Hashtable- objekt som har en egenskap för varje fält i JSON-strängen. JSON används ofta av webbplatser för att tillhandahålla en textrepresentation av objekt. Cmdleten lägger till egenskaperna i det nya objektet när varje rad i JSON-strängen bearbetas.

JSON-standarden tillåter duplicerade nyckelnamn, vilket är förbjudet i PSObject- och Hashtable- typer. Om JSON-strängen till exempel innehåller dubblettnycklar används endast den sista nyckeln av den här cmdleten. Se andra exempel nedan.

Om du vill generera en JSON-sträng från ett objekt använder du cmdleten ConvertTo-Json.

Den här cmdleten introducerades i PowerShell 3.0.

Notera

I Windows PowerShell 5.1 returnerade ConvertFrom-Json ett fel när en JSON-kommentar påträffades. I PowerShell 6 och senare stöder cmdleten JSON med kommentarer. JSON-kommentarer samlas inte in i objektens utdata av cmdleten. Mer information finns i avsnittet JSON-kommentarer i artikeln about_Comments.

Exempel

Exempel 1: Konvertera ett DateTime-objekt till ett JSON-objekt

Det här kommandot använder cmdletarna ConvertTo-Json och ConvertFrom-Json för att konvertera ett DateTime--objekt från cmdleten Get-Date till ett JSON-objekt och sedan till ett 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

I exemplet används cmdleten Select-Object för att hämta alla egenskaper för objektet DateTime. Den använder cmdleten ConvertTo-Json för att konvertera DateTime--objektet till en sträng formaterad som ett JSON-objekt och ConvertFrom-Json-cmdleten för att konvertera den JSON-formaterade strängen till ett PSCustomObject- objekt.

Exempel 2: Hämta JSON-strängar från en webbtjänst och konvertera dem till PowerShell-objekt

Det här kommandot använder cmdleten Invoke-WebRequest för att hämta JSON-strängar från en webbtjänst och använder sedan cmdleten ConvertFrom-Json för att konvertera JSON-innehåll till objekt som kan hanteras i 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

Du kan också använda cmdleten Invoke-RestMethod, som automatiskt konverterar JSON-innehåll till objekt.

Exempel 3: Konvertera en JSON-sträng till ett anpassat objekt

Det här exemplet visar hur du använder cmdleten ConvertFrom-Json för att konvertera en JSON-fil till ett anpassat PowerShell-objekt.

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

Kommandot använder Get-Content cmdlet för att hämta strängarna i en JSON-fil. Parametern Raw returnerar hela filen som ett enda JSON-objekt. Sedan använder den pipelineoperatorn för att skicka den avgränsade strängen till cmdleten ConvertFrom-Json, som konverterar den till ett anpassat objekt.

Exempel 4: Konvertera en JSON-sträng till en hash-tabell

Det här kommandot visar ett exempel där -AsHashtable-växeln kan övervinna begränsningarna i kommandot.

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

JSON-strängen innehåller två nyckel/värde-par med nycklar som endast skiljer sig åt i höljet. Utan växeln skulle kommandot ha genererat ett fel.

Exempel 5: Tur och retur för en matris med ett enda element

Det här kommandot visar ett exempel där växeln -NoEnumerate används för att köra om en JSON-matris med ett element.

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-strängen innehåller en matris med ett enda element. Utan denna inställning resulterar omvandlingen av JSON till en PSObject och sedan tillbaka med ConvertTo-Json-kommandot i ett enda heltal.

Parametrar

-AsHashtable

Konverterar JSON till ett hash-tabellobjekt. Den här växeln introducerades i PowerShell 6.0. Från och med PowerShell 7.3 är objektet en OrderedHashtable- och bevarar ordningen på nycklarna från JSON. I tidigare versioner är objektet en Hashtable-.

Det finns flera scenarier där den kan övervinna vissa begränsningar i cmdleten ConvertFrom-Json.

  • Utan den här växeln, när två eller flera nycklar i ett JSON-objekt är skiftlägesokänsligt identiska, behandlas de som identiska nycklar. I så fall ingår endast den sista av de icke skiftlägeskänsliga identiska nycklarna i det konverterade objektet.
  • Utan den här växeln genererar cmdleten ett fel när JSON innehåller en nyckel som är en tom sträng. PSCustomObject inte kan ha egenskapsnamn som är tomma strängar. Detta kan till exempel inträffa i project.lock.json filer.
  • Hash-tabeller kan bearbetas snabbare för vissa datastrukturer.
Typ:SwitchParameter
Position:Named
Standardvärde:False
Obligatorisk:False
Godkänn pipeline-indata:False
Godkänn jokertecken:False

-DateKind

Anger den metod som används vid parsning av datumtidsvärden i JSON-strängen. De godtagbara värdena för den här parametern är:

  • Default
  • Local
  • Utc
  • Offset
  • String

Information om hur dessa värden påverkar konverteringen finns i informationen i NOTES-.

Den här parametern introducerades i PowerShell 7.5.

Typ:Microsoft.PowerShell.Commands.JsonDateKind
Godkända värden:Default, Local, Utc, Offset, String
Position:Named
Standardvärde:Default
Obligatorisk:False
Godkänn pipeline-indata:False
Godkänn jokertecken:False

-Depth

Hämtar eller anger det maximala djup som JSON-indata tillåts ha. Standardvärdet är 1024.

Den här parametern introducerades i PowerShell 6.2.

Typ:Int32
Position:Named
Standardvärde:None
Obligatorisk:False
Godkänn pipeline-indata:False
Godkänn jokertecken:False

-InputObject

Anger JSON-strängarna som ska konverteras till JSON-objekt. Ange en variabel som innehåller strängen eller skriv ett kommando eller uttryck som hämtar strängen. Du kan också skicka en sträng till ConvertFrom-Json.

Parametern InputObject krävs, men dess värde kan vara en tom sträng. När indataobjektet är en tom sträng genererar ConvertFrom-Json inga utdata. Värdet InputObject kan inte vara $null.

Typ:String
Position:0
Standardvärde:None
Obligatorisk:True
Godkänn pipeline-indata:True
Godkänn jokertecken:False

-NoEnumerate

Anger att utdata inte räknas upp.

Om du anger den här parametern skickas matriser som ett enskilt objekt i stället för att varje element skickas separat. Detta garanterar att JSON kan rundresa via ConvertTo-Json.

Typ:SwitchParameter
Position:Named
Standardvärde:False
Obligatorisk:False
Godkänn pipeline-indata:False
Godkänn jokertecken:False

Indata

String

Du kan skicka en JSON-sträng till ConvertFrom-Json.

Utdata

PSCustomObject

OrderedHashtable

Kommentarer

Den här cmdleten implementeras med hjälp av Newtonsoft Json.NET.

Från och med PowerShell 6 försöker ConvertTo-Json konvertera strängar som är formaterade som tidsstämplar till DateTime- värden.

PowerShell 7.5 lade till parametern DateKind, vilket gör att du kan styra hur tidsstämpelsträngen konverteras. Parametern accepterar följande värden:

  • Default – Konverterar tidsstämpeln till en [datetime] instans enligt följande regler:
    • Om det inte finns någon tidszonsinformation i indatasträngen konverterar Json.NET serialiseraren värdet som ett ospecificerat tidsvärde.
    • Om tidszonsinformationen är en avslutande Zkonverterar Json.NET serialiseraren tidsstämpeln till ett UTC- värde.
    • Om tidsstämpeln innehåller en UTC-förskjutning som +02:00konverteras förskjutningen till anroparens konfigurerade tidszon. Standardutdataformateringen anger inte den ursprungliga tidszonsförskjutningen.
  • Local – Konverterar tidsstämpeln till en [datetime] instans i lokala tid. Om tidsstämpeln innehåller en UTC-förskjutning konverteras förskjutningen till anroparens konfigurerade tidszon. Standardutdataformateringen anger inte den ursprungliga tidszonsförskjutningen.
  • Utc – Konverterar värdet till en [datetime] instans i UTC-tid.
  • Offset – Konverterar tidsstämpeln till en [DateTimeOffset]-instans med tidszonsförskjutningen för den ursprungliga strängen som bevarades i den instansen. Om råsträngen inte innehåller någon tidszonsförskjutning anges värdet DateTimeOffset i den lokala tidszonen.
  • String – bevarar värdet för [string]-instansen. Detta säkerställer att all anpassad parsningslogik kan tillämpas på råsträngsvärdet.

PSObject- typ upprätthåller ordningen på egenskaperna enligt JSON-strängen. Från och med PowerShell 7.3 skapar parametern AsHashtable en OrderedHashtable. Nyckel/värde-par läggs till i den ordning som visas i JSON-strängen. OrderedHashtable bevarar den ordningen.