using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
public partial class MagicTime
[JsonProperty("Accel Delay")]
public long AccelDelay { get; set; }
[JsonProperty("Accel Period")]
public long AccelPeriod { get; set; }
[JsonProperty("Alt DT Step")]
public long AltDtStep { get; set; }
[JsonProperty("Beep On Command")]
public bool BeepOnCommand { get; set; }
[JsonProperty("Bunt Step")]
public long BuntStep { get; set; }
public static partial class JsonExtensions
static readonly IContractResolver defaultResolver = new JsonSerializer().ContractResolver;
public static T GetJsonPropertyValue<T>(object obj, string propertyName, IContractResolver resolver = null)
resolver = resolver ?? defaultResolver;
var contract = resolver.ResolveContract(obj.GetType());
if (contract is JsonObjectContract objectContract)
var property = objectContract.Properties.GetClosestMatchProperty(propertyName);
throw new JsonException(string.Format("Unknown property {0}", propertyName));
return (T)property.ValueProvider.GetValue(obj);
throw new JsonException(string.Format("Invalid contract {0}", contract));
public static void Test()
public static void Test1()
var MT = new MagicTime { AccelDelay = 21 };
var accelDelay = JsonExtensions.GetJsonPropertyValue<long>(MT, "Accel Delay");
Console.WriteLine("accelDelay = {0}", accelDelay);
Assert.IsTrue(accelDelay == MT.AccelDelay);
public static void Test2()
var MT = new MagicTime { AccelDelay = 21 };
var accelDelay = JsonExtensions.GetJsonPropertyValue<object>(MT, "Accel Delay");
Console.WriteLine("accelDelay = {0}", accelDelay);
Assert.IsTrue(MT.AccelDelay.Equals(accelDelay));
public static void Test3()
var MT = new MagicTime { AccelDelay = 21 };
var resolver = new CamelCasePropertyNamesContractResolver();
var accelDelay = JsonExtensions.GetJsonPropertyValue<object>(MT, "Accel Delay", resolver);
Console.WriteLine("accelDelay = {0}", accelDelay);
Assert.IsTrue(MT.AccelDelay.Equals(accelDelay));
public static void Main()
Console.WriteLine("Environment version: {0} ({1})", System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription , GetNetCoreVersion());
Console.WriteLine("Json.NET version: " + typeof(JsonSerializer).Assembly.FullName);
Console.WriteLine("Failed with unhandled exception: ");
public static string GetNetCoreVersion()
var assembly = typeof(System.Runtime.GCSettings).GetTypeInfo().Assembly;
var assemblyPath = assembly.CodeBase.Split(new[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries);
int netCoreAppIndex = Array.IndexOf(assemblyPath, "Microsoft.NETCore.App");
if (netCoreAppIndex > 0 && netCoreAppIndex < assemblyPath.Length - 2)
return assemblyPath[netCoreAppIndex + 1];