Comparing JSON structure Comparing JSON structure json json

Comparing JSON structure


One solution is to use the Json.NET and Json.NET Schema nuget packages to validate your JSON string against a JSON schema.

You can create a JSON schema or generate one based on C# objects. In this case, I generated some classes that matches your JSON structure (sorry about the class names):

public class RootObject{    [JsonProperty("collection", Required = Required.Always)]    public List<Item> Collection { get; set; }    public RootObject()    {        Collection = new List<Item>();    }}public class Item{    [JsonProperty("timePeriod", Required = Required.Always)]    public TimePeriod TimePeriod { get; set; }    [JsonProperty("type", Required = Required.Always)]    public string Type { get; set; }    [JsonProperty("amount", Required = Required.Always)]    public int Amount { get; set; }    [JsonProperty("outstanding", Required = Required.Always)]    public int Outstanding { get; set; }    [DataType(DataType.Date)]    [JsonProperty("due", Required = Required.Always)]    public DateTime Due { get; set; }}public class TimePeriod{    [DataType(DataType.Date)]    [JsonProperty("from", Required = Required.Always)]    public DateTime From { get; set; }    [DataType(DataType.Date)]    [JsonProperty("to", Required = Required.Always)]    public DateTime To { get; set; }}

I am assuming all properties are required. Also, regarding the DateTime properties I am using Data Annotations to specify that the dates do not contain the time part (as opposed to a full ISO date).

Validating the schema:

using System;using System.Collections.Generic;using System.ComponentModel.DataAnnotations;using Newtonsoft.Json;using Newtonsoft.Json.Linq;using Newtonsoft.Json.Schema;using Newtonsoft.Json.Schema.Generation;namespace ConsoleApp1{    class Program    {        static void Main(string[] args)        {            string json = @"{   ""collection"":[{      ""timePeriod"":{         ""from"": ""2017-01-01"",         ""to"": ""2017-02-01""      },      ""type"": ""a"",      ""amount"": 463872,      ""outstanding"": 463872,      ""due"": ""2017-03-08""   }]}";            var generator = new JSchemaGenerator();            JSchema schema = generator.Generate(typeof(RootObject));            JObject data = JObject.Parse(json);            bool isValidSchema = data.IsValid(schema);        }    }}

You can also get the schema errors as following:

IList<string> messages;bool isValidSchema = data.IsValid(schema, out messages);foreach (string message in messages){    Console.WriteLine(message);}