using System.Collections.Generic;
using System.Runtime.Serialization;
using Newtonsoft.Json.Converters;
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 PhysicalConverter : JsonConverter
public override bool CanConvert(Type objectType)
return objectType == typeof(Physical);
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
string value = (string)reader.Value;
string[] parts = value.Split(new char[] { ' ' }, 2);
if (!DimensionsByUnit.TryGetValue(parts[1], out dim)) dim = Dimension.Force;
Physical physical = new Physical()
Value = double.Parse(parts[0]),
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
Physical physical = (Physical)value;
writer.WriteValue(physical.Value.ToString("N0") + " " + physical.Unit);
private static Dictionary<string, Dimension> DimensionsByUnit = new Dictionary<string, Dimension>
{ "mg", Dimension.Weight },
{ "g", Dimension.Weight },
{ "kg", Dimension.Weight },
{ "°C", Dimension.Temperature },
{ "°F", Dimension.Temperature },
{ "°K", Dimension.Temperature },
{ "µs", Dimension.Time },
{ "ms", Dimension.Time },
{ "mm", Dimension.Displacement },
{ "cm", Dimension.Displacement },
{ "m", Dimension.Displacement },
[JsonConverter(typeof(StringEnumConverter))]
[EnumMember(Value = "Weight Scale")]
public class MeasurementInfo
public Instrument Instrument { get; set; }
[JsonProperty("Max Reading")]
public Physical MaxReading { get; set; }
[JsonProperty("Min Reading")]
public Physical MinReading { get; set; }
[JsonProperty("Ambient Temperature")]
public Physical AmbientTemperature { get; set; }
public enum Dimension { Force, Temperature, Displacement, Time, Weight }
[JsonConverter(typeof(PhysicalConverter))]
public Dimension Dimension { get; set; }
public double Value { get; set; }
public string Unit { get; set; }