Search code examples
jsonpowershelltry-catchpowershell-3.0

How to check if file has valid JSON syntax in Powershell


I am trying to write a powershell script that reads a file and prints "true" if it is a valid JSON file. I am using Powershell v3.0 and this is what I have right now :

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

How do I check the return code? I mean I want something like this :

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

Solution

  • UPDATE 2021: PowerShell 6 and newer versions

    PowerShell 6 brings a brand new Test-Json cmdlet. Here is the reference.

    You can simply pass the raw file content directly to the Test-Json cmdlet.

    $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 and earlier versions

    There is no Test-Json cmdlet in these versions, so the best way is to put your ConvertFrom-Json cmdlet inside a try ... catch block

    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";
    }