2013-06-11 8 views
7

ファイルを読み込んで、有効なJSONファイルであれば "true"を出力するpowershellスクリプトを作成しようとしています。私はPowershell v3.0を使用しています。これは現在私が持っているものです:Powershellでファイルに有効なJSON構文があるかどうかを確認する方法

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

戻りコードを確認するにはどうすればよいですか?私はそれがConvertFrom-Jsonを使用して例外をキャッチする以外に解決策が存在するとは思わない

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

私は例外をキャッチすることでそれを行うことができます。しかし、他の方法はありますか? – Pulkit

答えて

7

最良の方法は、

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

ありがとう! try-catchブロックが唯一のオプションだと思います。 – Pulkit

+0

保存された私の人生。 PS4が 'invoke-restMethod'でJSONをPSObjectに変換しなかった問題を解明しようとしています。あなたはインターネットに勝つ。 –

+0

残念ながら、{"a":1、 "a":2}はこのテストに合格しますが、重複したプロパティキーを持ちます。パーザのほとんどは不平を言っておらず、通常は最新の財産を検討しています。しかし、間違いなく問題があります。 – Myobis

1

:私はこのような何かをしたいわけ。

0

ConvertFrom-JSONはサイズだけでJSONオブジェクト< 2メガバイトのために働くだろうtry ... catchブロック内でごConvertFrom-Jsonコマンドレットを置くことであるので、コマンドレットのようなTest-Jsonありません。 高ければ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" 
} 
関連する問題