2013-06-11 18 views
7

içinde olup olmadığını kontrol etme Bir dosyayı okuyan ve geçerli bir JSON dosyasıysa "true" yazdıran bir powershell komut dosyası yazmaya çalışıyorum. Ben PowerShell v3.0 kullanıyorum ve bu şu anda ne var:Dosyanın geçerli JSON sözdizimi Powershell

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

nasıl dönüş kodunu kontrol edebilirim? Ben ConvertFrom-Json kullanarak özel durumu yakalamak çok bir başka çözüm var olduğunu sanmıyorum

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

kullanabilirsiniz yüksek İçin . Ama başka bir yolu var mı? – Pulkit

cevap

7

, cmdlet'indeki gibi bir Test-Json yoktur. Eğer ben istisna yakalayarak bunu yapabilir JavaScriptSerializer sınıfı

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" 
} 
+0

teşekkürler! Bence try-catch bloğu tek seçenek. – Pulkit

+0

hayatımı kurtardı. PS4'ün JSON'u “invoke-restMethod” ile PSObject'e dönüştürmediği bir sorunu çözmeye çalışmak. İnterneti kazanırsın. –

+0

Maalesef, {"a": 1, "a": 2} bu testi geçerken yinelenen özellik tuşları var. Parserlerin çoğu şikayette bulunmazlar ve genellikle en yeni mülkleri dikkate almazlar. Ancak, kesinlikle bir problem vardır. – Myobis

1

: Ben böyle bir şey istiyorum yani. En iyi yolu

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

ConvertFrom-JSON ama sadece bir JSON nesnesi boyutunda < 2MB için çalışacak bir try ... catch blokunun içinde ConvertFrom-Json cmdlet'ini koymaktır böylece

İlgili konular