// // // To parse this JSON data, add NuGet 'Newtonsoft.Json' then do: // // using HeronTrack.Ingestion.Common.EventCatalog; // // var position = Position.FromJson(jsonString); namespace HeronTrack.Ingestion.Common.EventCatalog { using System; using System.Collections.Generic; using System.Globalization; using Newtonsoft.Json; using Newtonsoft.Json.Converters; public partial class Position { [JsonProperty("accuracyMeters", Required = Required.AllowNull)] public double? AccuracyMeters { get; set; } [JsonProperty("accuracyPercentage", Required = Required.AllowNull)] public double? AccuracyPercentage { get; set; } [JsonProperty("batteryLevel", Required = Required.AllowNull)] public double? BatteryLevel { get; set; } [JsonProperty("bleType")] public string BleType { get; set; } [JsonProperty("companyId")] public string CompanyId { get; set; } [JsonProperty("correlationId", Required = Required.Always)] public string CorrelationId { get; set; } [JsonProperty("currentChampion")] public CurrentChampion CurrentChampion { get; set; } [JsonProperty("dataSource", Required = Required.Always)] public DataSource DataSource { get; set; } [JsonProperty("date", Required = Required.Always)] public DateTimeOffset Date { get; set; } [JsonProperty("fillingStatus", Required = Required.AllowNull)] public double? FillingStatus { get; set; } [JsonProperty("gatewayIdentifier", Required = Required.AllowNull)] public string GatewayIdentifier { get; set; } [JsonProperty("inMotion")] public bool? InMotion { get; set; } [JsonProperty("isStrong")] public bool? IsStrong { get; set; } [JsonProperty("latitude", Required = Required.Always)] public double Latitude { get; set; } [JsonProperty("longitude", Required = Required.Always)] public double Longitude { get; set; } [JsonProperty("magnetClosed", Required = Required.AllowNull)] public bool? MagnetClosed { get; set; } [JsonProperty("numberWakeUps", Required = Required.AllowNull)] public double? NumberWakeUps { get; set; } [JsonProperty("phoneId", Required = Required.AllowNull)] public string PhoneId { get; set; } [JsonProperty("reason")] public Reason? Reason { get; set; } [JsonProperty("tagId", Required = Required.AllowNull)] public string TagId { get; set; } [JsonProperty("tagIdentifier")] public string TagIdentifier { get; set; } [JsonProperty("toolId", Required = Required.AllowNull)] public string ToolId { get; set; } [JsonProperty("type", Required = Required.Always)] public string Type { get; set; } [JsonProperty("userId", Required = Required.AllowNull)] public string UserId { get; set; } [JsonProperty("uuid")] public string Uuid { get; set; } [JsonProperty("workingHours", Required = Required.AllowNull)] public double? WorkingHours { get; set; } [JsonProperty("workingMeasureInProgress", Required = Required.AllowNull)] public bool? WorkingMeasureInProgress { get; set; } [JsonProperty("workingMinutes", Required = Required.AllowNull)] public double? WorkingMinutes { get; set; } } public partial class CurrentChampion { [JsonProperty("accuracyMeters", Required = Required.AllowNull)] public double? AccuracyMeters { get; set; } [JsonProperty("accuracyPercentage", Required = Required.AllowNull)] public double? AccuracyPercentage { get; set; } [JsonProperty("batteryLevel", Required = Required.AllowNull)] public double? BatteryLevel { get; set; } [JsonProperty("bleType")] public string BleType { get; set; } [JsonProperty("correlationId", Required = Required.Always)] public string CorrelationId { get; set; } [JsonProperty("dataSource", Required = Required.Always)] public DataSource DataSource { get; set; } [JsonProperty("date", Required = Required.Always)] public DateTimeOffset Date { get; set; } [JsonProperty("fillingStatus", Required = Required.AllowNull)] public double? FillingStatus { get; set; } [JsonProperty("gatewayIdentifier", Required = Required.AllowNull)] public string GatewayIdentifier { get; set; } [JsonProperty("inMotion")] public bool? InMotion { get; set; } [JsonProperty("isStrong")] public bool? IsStrong { get; set; } [JsonProperty("latitude", Required = Required.Always)] public double Latitude { get; set; } [JsonProperty("longitude", Required = Required.Always)] public double Longitude { get; set; } [JsonProperty("magnetClosed", Required = Required.AllowNull)] public bool? MagnetClosed { get; set; } [JsonProperty("numberWakeUps", Required = Required.AllowNull)] public double? NumberWakeUps { get; set; } [JsonProperty("phoneId", Required = Required.AllowNull)] public string PhoneId { get; set; } [JsonProperty("reason")] public Reason? Reason { get; set; } [JsonProperty("tagId", Required = Required.AllowNull)] public string TagId { get; set; } [JsonProperty("tagIdentifier")] public string TagIdentifier { get; set; } [JsonProperty("toolId", Required = Required.AllowNull)] public string ToolId { get; set; } [JsonProperty("type", Required = Required.Always)] public string Type { get; set; } [JsonProperty("userId", Required = Required.AllowNull)] public string UserId { get; set; } [JsonProperty("uuid")] public string Uuid { get; set; } [JsonProperty("workingHours", Required = Required.AllowNull)] public double? WorkingHours { get; set; } [JsonProperty("workingMeasureInProgress", Required = Required.AllowNull)] public bool? WorkingMeasureInProgress { get; set; } [JsonProperty("workingMinutes", Required = Required.AllowNull)] public double? WorkingMinutes { get; set; } } public enum DataSource { Btv, Computed, FullComputedLocation, FullGps, Gateway, Iet10ComputedLocation, Iet10Rc1Gps, Iet10Rc1HeartBeat33, Iet10Rc1HeartBeat39, Iet10Rc1Magnet, Iet10Rc1NoWifiNoGps, Iet10Rc1Wifi1Macs, Iet10Rc1Wifi2Macs, Manual, MobileGateway, Phone, PhoneSighting, QrCode }; public enum Reason { Movement, Periodic }; public partial class Position { public static Position FromJson(string json) => JsonConvert.DeserializeObject(json, HeronTrack.Ingestion.Common.EventCatalog.Converter.Settings); } public static class Serialize { public static string ToJson(this Position self) => JsonConvert.SerializeObject(self, HeronTrack.Ingestion.Common.EventCatalog.Converter.Settings); } internal static class Converter { public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings { MetadataPropertyHandling = MetadataPropertyHandling.Ignore, DateParseHandling = DateParseHandling.None, Converters = { DataSourceConverter.Singleton, ReasonConverter.Singleton, new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal } }, }; } internal class DataSourceConverter : JsonConverter { public override bool CanConvert(Type t) => t == typeof(DataSource) || t == typeof(DataSource?); public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) return null; var value = serializer.Deserialize(reader); switch (value) { case "BTV": return DataSource.Btv; case "Computed": return DataSource.Computed; case "Full-ComputedLocation": return DataSource.FullComputedLocation; case "Full-Gps": return DataSource.FullGps; case "Gateway": return DataSource.Gateway; case "IET10-ComputedLocation": return DataSource.Iet10ComputedLocation; case "IET10RC1-Gps": return DataSource.Iet10Rc1Gps; case "IET10RC1-HeartBeat33": return DataSource.Iet10Rc1HeartBeat33; case "IET10RC1-HeartBeat39": return DataSource.Iet10Rc1HeartBeat39; case "IET10RC1-Magnet": return DataSource.Iet10Rc1Magnet; case "IET10RC1-NoWifi-NoGps": return DataSource.Iet10Rc1NoWifiNoGps; case "IET10RC1-Wifi1Macs": return DataSource.Iet10Rc1Wifi1Macs; case "IET10RC1-Wifi2Macs": return DataSource.Iet10Rc1Wifi2Macs; case "Manual": return DataSource.Manual; case "MobileGateway": return DataSource.MobileGateway; case "Phone": return DataSource.Phone; case "PhoneSighting": return DataSource.PhoneSighting; case "QRCode": return DataSource.QrCode; } throw new Exception("Cannot unmarshal type DataSource"); } public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer) { if (untypedValue == null) { serializer.Serialize(writer, null); return; } var value = (DataSource)untypedValue; switch (value) { case DataSource.Btv: serializer.Serialize(writer, "BTV"); return; case DataSource.Computed: serializer.Serialize(writer, "Computed"); return; case DataSource.FullComputedLocation: serializer.Serialize(writer, "Full-ComputedLocation"); return; case DataSource.FullGps: serializer.Serialize(writer, "Full-Gps"); return; case DataSource.Gateway: serializer.Serialize(writer, "Gateway"); return; case DataSource.Iet10ComputedLocation: serializer.Serialize(writer, "IET10-ComputedLocation"); return; case DataSource.Iet10Rc1Gps: serializer.Serialize(writer, "IET10RC1-Gps"); return; case DataSource.Iet10Rc1HeartBeat33: serializer.Serialize(writer, "IET10RC1-HeartBeat33"); return; case DataSource.Iet10Rc1HeartBeat39: serializer.Serialize(writer, "IET10RC1-HeartBeat39"); return; case DataSource.Iet10Rc1Magnet: serializer.Serialize(writer, "IET10RC1-Magnet"); return; case DataSource.Iet10Rc1NoWifiNoGps: serializer.Serialize(writer, "IET10RC1-NoWifi-NoGps"); return; case DataSource.Iet10Rc1Wifi1Macs: serializer.Serialize(writer, "IET10RC1-Wifi1Macs"); return; case DataSource.Iet10Rc1Wifi2Macs: serializer.Serialize(writer, "IET10RC1-Wifi2Macs"); return; case DataSource.Manual: serializer.Serialize(writer, "Manual"); return; case DataSource.MobileGateway: serializer.Serialize(writer, "MobileGateway"); return; case DataSource.Phone: serializer.Serialize(writer, "Phone"); return; case DataSource.PhoneSighting: serializer.Serialize(writer, "PhoneSighting"); return; case DataSource.QrCode: serializer.Serialize(writer, "QRCode"); return; } throw new Exception("Cannot marshal type DataSource"); } public static readonly DataSourceConverter Singleton = new DataSourceConverter(); } internal class ReasonConverter : JsonConverter { public override bool CanConvert(Type t) => t == typeof(Reason) || t == typeof(Reason?); public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) return null; var value = serializer.Deserialize(reader); switch (value) { case "Movement": return Reason.Movement; case "Periodic": return Reason.Periodic; } throw new Exception("Cannot unmarshal type Reason"); } public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer) { if (untypedValue == null) { serializer.Serialize(writer, null); return; } var value = (Reason)untypedValue; switch (value) { case Reason.Movement: serializer.Serialize(writer, "Movement"); return; case Reason.Periodic: serializer.Serialize(writer, "Periodic"); return; } throw new Exception("Cannot marshal type Reason"); } public static readonly ReasonConverter Singleton = new ReasonConverter(); } }