Skip to content

Instantly share code, notes, and snippets.

@JamesNK
Last active July 1, 2021 15:38
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JamesNK/7e6d026c8b78c049bb1e1b6fb0ed85cf to your computer and use it in GitHub Desktop.
Save JamesNK/7e6d026c8b78c049bb1e1b6fb0ed85cf to your computer and use it in GitHub Desktop.
Validate Schema from PowerShell
$ErrorActionPreference = "Stop"
$NewtonsoftJsonPath = Resolve-Path -Path "bin\Newtonsoft.Json.dll"
$NewtonsoftJsonSchemaPath = Resolve-Path -Path "bin\Newtonsoft.Json.Schema.dll"
Add-Type -Path $NewtonsoftJsonPath
Add-Type -Path $NewtonsoftJsonSchemaPath
$source = @'
public class Validator
{
public static System.Collections.Generic.IList<string> Validate(Newtonsoft.Json.Linq.JToken token, Newtonsoft.Json.Schema.JSchema schema)
{
System.Collections.Generic.IList<string> messages;
Newtonsoft.Json.Schema.SchemaExtensions.IsValid(token, schema, out messages);
return messages;
}
}
'@
Add-Type -TypeDefinition $source -ReferencedAssemblies $NewtonsoftJsonPath,$NewtonsoftJsonSchemaPath
$Json = @'
{"prop1":"value"}
'@
$SchemaJson = @'
{"type":"array"}
'@
write-host "=========================" -foregroundcolor "white"
write-host "Json.NET Schema Validator" -foregroundcolor "white"
write-host "=========================" -foregroundcolor "white"
write-host
write-host "Json: $Json"
write-host "SchemaJson: $SchemaJson"
$Token = [Newtonsoft.Json.Linq.JToken]::Parse($Json)
$Schema = [Newtonsoft.Json.Schema.JSchema]::Parse($SchemaJson)
$ErrorMessages = [Validator]::Validate($Token, $Schema)
$IsValid = $ErrorMessages.Count -eq 0
write-host "Schema is valid: $IsValid" -foregroundcolor "white"
foreach ($ErrorMessage in $ErrorMessages) {
write-host $ErrorMessage -foregroundcolor "red"
}
write-host
@jcoryatjr
Copy link

After playing with it a bit, I got this to work in vscode:
Leaving the json and schema as strings resolved the type mismatch errors

            $moduleRootPath = Split-Path -Path ( Split-Path -Path $PSCommandPath -Parent ) -Parent
            Add-Type -Path "$moduleRootPath\bin\Newtonsoft.Json.dll"
            Add-Type -Path "$moduleRootPath\bin\Newtonsoft.Json.Schema.dll"

            $result = [Newtonsoft.Json.Schema.SchemaExtensions]::IsValid( $json, $schema, [ref] $errorMessages )

            if ( -not $result -or $errorMessages.Count ) {
                $result = $false
                $errorMessages | Write-Error
            }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment