15

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

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

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

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

4 回答 4

17

2021 年更新:PowerShell 6 和更新版本

PowerShell 6 带来了一个全新的Test-Jsoncmdlet。这是参考

您可以简单地将原始文件内容直接传递给Test-Jsoncmdlet。

$text = Get-Content .\filename.txt -Raw

if ($text | Test-Json) {
    $powershellRepresentation = ConvertFrom-Json $text -ErrorAction Stop;
    Write-Host "Provided text has been correctly parsed to JSON";
} else {
    Write-Host "Provided text is not a valid JSON string";
}

PowerShell 5 及更早版本

这些版本中没有Test-Jsoncmdlet,因此最好的方法是将您的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";
}
于 2013-06-18T13:54:32.080 回答
7

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

例子

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

if($isValid){
 Write-Host "not JSON"
}
else{
 Write-Host "True"
}

ARM 模板警告

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

GitHub 问题

于 2019-07-09T20:08:13.057 回答
1

我认为除了使用捕获异常之外,它不存在其他解决方案ConvertFrom-Json

于 2013-06-11T11:27:14.027 回答
1

ConvertFrom-JSON 可以工作,但只适用于小于 2MB 的 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"
}
于 2014-09-24T09:13:53.490 回答