using System.Collections.Generic;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Schema;
using Newtonsoft.Json.Schema.Generation;
using Newtonsoft.Json.Serialization;
public static void Main()
string json = "{\"Id\":\"94b672d2-1851-4730-bc4c-9cd4cf3c1b5e\",\"Type\":\"PriviumExtendRtpMessage\",\"Timestamp\":\"2023-10-18T11:01:34.2306468Z\",\"Content\":{\"MemberNumber\":\"PriviumNumber123\",\"ExpiryDate\":\"2024-04-18T11:01:34.2306419Z\",\"RtpMembershipId\":\"ef858743-1dab-49ea-9892-7f665c3e2d2b\"}}\r\n";
var message = SerializerUtils.Deserialize<EventMessageExtended>(json);
Console.WriteLine(message == null || message == default(EventMessageExtended));
public static class SerializerUtils
public static string Serialize<T>(T value)
return JsonConvert.SerializeObject(value);
public static T? Deserialize<T>(string jsonObject)
bool isValid = SerializerUtils.ValidateSchema<T>(jsonObject);
return JsonConvert.DeserializeObject<T>(jsonObject);
private static bool ValidateSchema<T>(string jsonData)
var generator = new JSchemaGenerator
ContractResolver = new CaseInsensitiveContractResolver()
JSchema schema = generator.Generate(typeof(T));
JToken token = JToken.Parse(jsonData.ToLower());
bool isValid = token.IsValid(schema, out IList<string> messages);
public class CaseInsensitiveContractResolver : DefaultContractResolver
protected override string ResolvePropertyName(string propertyName)
return propertyName.ToLower();
public class EventMessageExtended : EventMessage
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public int ProcessingCount { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public DateTime? LastProcessing { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public DateTime? ReservedUntil { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public bool Deleted { get; set; }
public class EventMessage
public Guid Id { get; set; }
public string Type { get; set; }
public DateTime Timestamp { get; set; }
public JObject Content { get; set; }
return this.Content.ToObject<T>();