using System.Collections.Generic;
using Newtonsoft.Json.Serialization;
namespace ORAMS_III_Sisgeo_Logger_Data_Service.SisgeoModels
public static void Main()
""type"": ""voltageReadingsV1"",
""nodeModel"": ""LS-G6-VOLT-4-EU"",
""readingType"": ""Potentiometer"",
""readingData"": ""442.0150518"",
""engineeringValue"": ""22.10075259"",
""engineeringUnit"": ""mm""
""readingType"": ""Potentiometer"",
""readingData"": ""372.0518947"",
""engineeringValue"": ""18.60259474"",
""engineeringUnit"": ""mm""
""readingType"": ""Potentiometer"",
""readingData"": ""495.0417876"",
""engineeringValue"": ""24.75208938"",
""engineeringUnit"": ""mm""
""readingType"": ""Potentiometer"",
""readingData"": ""392.9279447"",
""engineeringValue"": ""19.64639724"",
""engineeringUnit"": ""mm""
""type"": ""geoflexReadingsV1"",
""nodeModel"": ""AM-H6-VOLT-1-EU"",
var settings = new JsonSerializerSettings
DateTimeZoneHandling = DateTimeZoneHandling.Utc,
MissingMemberHandling = MissingMemberHandling.Ignore,
NullValueHandling = NullValueHandling.Ignore,
TypeNameHandling = TypeNameHandling.Auto,
SerializationBinder = new SensorReadingSerializationBinder()
var readings1 = JsonConvert.DeserializeObject<NodeResponse>(json1.Replace("\"type\"", "\"$type\""), settings);
FiddleHelper.Dump(readings1);
var readings2 = JsonConvert.DeserializeObject<NodeResponse>(json2.Replace("\"type\"", "\"$type\""), settings);
FiddleHelper.Dump(readings2);
var stringOutput = JsonConvert.SerializeObject(readings2, readings2.GetType(), settings);
Console.WriteLine(stringOutput);
public class SensorReadingSerializationBinder : ISerializationBinder
public static readonly string[] ModelTypes =
"VibratingWireReadingsV1",
"InclinometerReadingsV1",
"InclinometerReadingsV2",
"GenericModbusReadingsV1",
public ISerializationBinder DefaultBinder
if (_defaultBinder == null)
_defaultBinder = new DefaultSerializationBinder();
set => _defaultBinder = value;
private ISerializationBinder _defaultBinder;
public void BindToName(Type serializedType, out string assemblyName, out string typeName)
DefaultBinder.BindToName(serializedType, out assemblyName, out typeName);
public Type BindToType(string assemblyName, string typeName)
var modelType = ModelTypes.SingleOrDefault(x => String.Equals(x, typeName, StringComparison.OrdinalIgnoreCase));
typeName = $"ORAMS_III_Sisgeo_Logger_Data_Service.SisgeoModels.NodeResponse`1[ORAMS_III_Sisgeo_Logger_Data_Service.SisgeoModels.{modelType}]";
return System.Type.GetType(typeName);
public class NodeResponse
public string Type { get;set; }
public class NodeResponse<T> : NodeResponse
public NodeReadings<T> Value { get;set; }
public class NodeReadings<T> where T: IReading
public string NodeModel { get;set; }
public List<T> Readings { get;set; }
public interface IReading {}
public class GeoflexReadingsV1 : IReading
public string SensorNum { get;set; }
public decimal ChnY { get;set; }
public decimal ChnX { get;set; }
public class VoltageReadingsV1 : IReading
public string readingType { get;set; }
public byte Channel { get;set; }
public string ReadingData { get;set; }
public string EngineeringValue { get;set; }
public string EngineeringUnit { get;set; }