2013-06-11 7 views
7

Sto provando a scrivere uno script PowerShell che legge un file e stampa "true" se si tratta di un file JSON valido. Sto usando Powershell v3.0 e questo è ciò che ho in questo momento:Come verificare se il file ha una sintassi JSON valida in Powershell

$text = Get-Content .\filename.txt -Raw 
$powershellRepresentation = $text | ConvertFrom-Json 

Come si controlla il codice di ritorno? Voglio dire che voglio qualcosa di simile:

if(file not a JSON file){ 
Write-Host "not JSON" 
} 
else{ 
Write-Host "True" 
} 
+0

Posso farlo rilevando l'eccezione. Ma esiste un altro modo? – Pulkit

risposta

7

non c'è un Test-Json come cmdlet, quindi il modo migliore è quello di mettere il vostro ConvertFrom-Json cmdlet all'interno di un blocco try ... catch

try { 
    $powershellRepresentation = ConvertFrom-Json $text -ErrorAction Stop; 
    $validJson = $true; 
} catch { 
    $validJson = $false; 
} 

if ($validJson) { 
    Write-Host "Provided text has been correctly parsed to JSON"; 
} else { 
    Write-Host "Provided text is not a valid JSON string"; 
} 
+0

grazie! Immagino che il blocco try-catch sia l'unica opzione. – Pulkit

+0

mi ha salvato la vita. cercando di capire un problema in cui PS4 non ha convertito JSON in PSObject con 'invoke-restMethod'. tu vinci internet. –

+0

Sfortunatamente, {"a": 1, "a": 2} passa questo test mentre ha le chiavi di proprietà duplicate. La maggior parte dei parser non si lamentano e solitamente considerano l'ultima proprietà. Tuttavia, c'è sicuramente un problema. – Myobis

1

Non credo che esista un altra soluzione che cattura l'eccezione utilizzando ConvertFrom-Json.

0

ConvertFrom-JSON avrebbe funzionato, ma solo per un oggetto JSON < 2 MB di dimensione. Per maggiori è possibile utilizzare la classe JavaScriptSerializer

try 
{ 
    $jsser = New-Object System.Web.Script.Serialization.JavaScriptSerializer 
    $jsser.MaxJsonLength = $jsser.MaxJsonLength * 10 
    $jsser.RecursionLimit = 99  

    $outObject = $jsser.DeserializeObject($json) 
} 
catch 
{ 
    Write-Host "Error converting $text to JSON" 
} 
Problemi correlati