using System.Runtime.Serialization;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq;
public static void Main()
var myMeasure = new MeasurementInfo()
Instrument = Instrument.WeightScale,
MaxReading = new Physical()
Dimension = Dimension.Weight,
MinReading = new Physical()
Dimension = Dimension.Weight,
AmbientTemperature = new Physical()
Dimension = Dimension.Temperature,
string json = JsonConvert.SerializeObject(myMeasure, Formatting.Indented);
Console.WriteLine(new String('-', 30));
var measure = JsonConvert.DeserializeObject<MeasurementInfo>(json);
Console.WriteLine("Instrument: " + measure.Instrument);
Console.WriteLine("Min Reading Dimension: " + measure.MinReading.Dimension);
Console.WriteLine("Min Reading Value: " + measure.MinReading.Value);
Console.WriteLine("Min Reading Unit: " + measure.MinReading.Unit);
Console.WriteLine("Max Reading Dimension: " + measure.MaxReading.Dimension);
Console.WriteLine("Max Reading Value: " + measure.MaxReading.Value);
Console.WriteLine("Max Reading Unit: " + measure.MaxReading.Unit);
Console.WriteLine("Ambient Temp Dimension: " + measure.AmbientTemperature.Dimension);
Console.WriteLine("Ambient Temp Value: " + measure.AmbientTemperature.Value);
Console.WriteLine("Ambient Temp Unit: " + measure.AmbientTemperature.Unit);
public class MeasurementInfoConverter : JsonConverter
public override bool CanConvert(Type objectType)
return objectType == typeof(MeasurementInfo);
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
JObject obj = JObject.Load(reader);
MeasurementInfo info = new MeasurementInfo();
info.Instrument = obj["Instrument"].ToObject<Instrument>(serializer);
info.MinReading = ReadPhysical(obj, "Min Reading", info.Instrument);
info.MaxReading = ReadPhysical(obj, "Max Reading", info.Instrument);
info.AmbientTemperature = ReadPhysical(obj, "Ambient Temperature", Instrument.Thermometer);
private Physical ReadPhysical(JObject obj, string name, Instrument instrument)
Dimension dim = Dimension.Force;
case Instrument.WeightScale: dim = Dimension.Weight; break;
case Instrument.Chronometer: dim = Dimension.Time; break;
case Instrument.Thermometer: dim = Dimension.Temperature; break;
case Instrument.Caliper: dim = Dimension.Displacement; break;
string[] parts = ((string)obj[name]).Split(new char[] { ' ' }, 2);
Physical physical = new Physical()
Value = double.Parse(parts[0]),
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
MeasurementInfo info = (MeasurementInfo)value;
JObject obj = new JObject();
obj.Add("Instrument", JToken.FromObject(info.Instrument, serializer));
WritePhysical(obj, "Min Reading", info.MinReading);
WritePhysical(obj, "Max Reading", info.MaxReading);
WritePhysical(obj, "Ambient Temperature", info.AmbientTemperature);
private void WritePhysical(JObject obj, string name, Physical physical)
obj.Add(name, physical.Value.ToString("N0") + " " + physical.Unit);
[JsonConverter(typeof(StringEnumConverter))]
[EnumMember(Value = "Weight Scale")]
[JsonConverter(typeof(MeasurementInfoConverter))]
public class MeasurementInfo
public Instrument Instrument { get; set; }
public Physical MaxReading { get; set; }
public Physical MinReading { get; set; }
public Physical AmbientTemperature { get; set; }
public enum Dimension { Force, Temperature, Displacement, Time, Weight }
public Dimension Dimension { get; set; }
public double Value { get; set; }
public string Unit { get; set; }