using System.Collections.Generic;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Schema;
static void Main(string[] args)
""$schema"": ""http://json-schema.org/draft-2019-09/schema"",
""person"": { ""$ref"": ""#/$defs/person"" },
""address"": { ""$ref"": ""#/$defs/address"" }
""required"": [""person"", ""address""],
""firstName"": { ""type"": ""string"" },
""lastName"": { ""type"": ""string"" }
""required"": [""firstName"", ""lastName""]
""street"": { ""type"": ""string"" },
""city"": { ""type"": ""string"" }
""required"": [""street"", ""city""]
JSchema schema = JSchema.Parse(schemaJson);
string jsonToValidate = @"{
""street"": ""123 Elm Street"",
""city"": ""Springfield""
JObject jsonObject = JObject.Parse(jsonToValidate);
IList<ValidationError> validationErrors;
if (jsonObject.IsValid(schema, out validationErrors))
Console.WriteLine("JSON is valid!");
Console.WriteLine("JSON is invalid:");
foreach (var error in validationErrors)
Console.WriteLine($"- {error.Message} (Path: {error.Path})");