如何在Powershell中检查文件是否具有有效的JSON语法

Pul*_*kit 9 powershell json powershell-3.0

我正在尝试编写一个PowerShell脚本来读取文件并打印"true"如果它是一个有效的JSON文件.我正在使用Powershell v3.0,这就是我现在所拥有的:

$text = Get-Content .\filename.txt -Raw 
$powershellRepresentation = $text | ConvertFrom-Json
Run Code Online (Sandbox Code Playgroud)

如何查看返回代码?我的意思是我想要这样的东西:

if(file not a JSON file){
 Write-Host "not JSON"
}
else{
 Write-Host "True"
}
Run Code Online (Sandbox Code Playgroud)

Nai*_*gel 12

没有Test-Json类似cmdlet,因此最好的方法是将ConvertFrom-Jsoncmdlet放在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";
}
Run Code Online (Sandbox Code Playgroud)

  • FWIW...在 PS 6.1 中添加了 test-json https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/test-json?view=powershell-6 (5认同)
  • 我尝试使用内置的“Test-Json”和“if(Test-Json $text) {...}”重复此功能,但当文件包含诸如“egg”或“{{}”之类的内容。这个解决方案非常有效!不知道为什么我无法让“Test-Json”工作...... (2认同)

Rob*_*eer 7

如果您遇到此问题并且可以使用 PowerShell 6 或更高版本,现在有一个 Test-Json cmdlet。它还不仅可以验证它是有效的 JSON,还可以使用-Schemaparam验证它是否符合特定的 JSON 模式。

例子

$isValid = Get-Content .\filename.txt -Raw | Test-Json 

if($isValid){
 Write-Host "not JSON"
}
else{
 Write-Host "True"
}
Run Code Online (Sandbox Code Playgroud)

ARM 模板警告

希望通过以下方式验证 ARM 模板的用户的说明-Schema(我无法想象更完美的用例)。在撰写本文时,Test-Json用于验证的底层库NJsonSchema 中存在一个或多个错误,并且无法验证 ARM 模板。

GitHub 问题