using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq;
public interface IJsonData { }
public class IpData : IJsonData
public IpData(double spray, IPAddress ip)
=> (Spray, Ip) = (spray, ip);
public double Spray { get; }
[JsonConverter(typeof(IPAddressConverter))]
public IPAddress Ip { get; }
public class AccessData : IJsonData
public AccessData(int access, double sum, DateTimeOffset date, int pass)
=> (Access, Sum, Date, Pass) = (access, sum, date, pass);
public int Access { get; }
public double Sum { get; }
[JsonConverter(typeof(DateFormatConverter), "dd.MM.yyyy HH':'mm':'ss")]
public DateTimeOffset Date { get; }
class DateFormatConverter : IsoDateTimeConverter
public DateFormatConverter(string format) => DateTimeFormat = format;
class IPAddressConverter : JsonConverter
public override bool CanConvert(Type objectType) => objectType == typeof(IPAddress);
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) => writer.WriteValue(value.ToString());
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) => IPAddress.Parse((string)reader.Value);
public class JsonDataConverter : JsonConverter
public override bool CanConvert(Type objectType)
=> objectType == typeof(IJsonData);
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
=> throw new InvalidOperationException("Use default serialization.");
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
var jsonObject = JObject.Load(reader);
return jsonObject["ip"] != null ? jsonObject.ToObject<IpData>() : (IJsonData)jsonObject.ToObject<AccessData>();
public static void Main()
var jsonString = "[{\"spray\":\"250.00\",\"ip\":\"202.214.237.72\"},{\"access\":\"444\",\"sum\":\"100.00\",\"date\":\"13.07.2020 19:28:49\",\"pass\":\"0\"},{\"access\":\"444\",\"sum\":\"50.00\",\"date\":\"13.07.2020 19:21:00\",\"pass\":\"1\"}]";
var json = JsonConvert.DeserializeObject<IJsonData[]>(jsonString, new JsonDataConverter());
foreach (var item in json)
Console.WriteLine($"Ip данные: {ipData.Ip} | {ipData.Spray}");
case AccessData accesData:
Console.WriteLine($"Access данные: {accesData.Date} | {accesData.Sum}");