using Newtonsoft.Json.Linq;
public static void Main()
""stringValue"" : 0.0050000012852251529693603515625,
""decimalValue"" : 0.0050000012852251529693603515625,
""bigDecimalValue"" : 0.0050000012852251529693603515625
var settings = new JsonSerializerSettings();
settings.FloatParseHandling = FloatParseHandling.Decimal;
settings.Converters.Add(new JsonBigDecimalConverter());
var result = JsonConvert.DeserializeObject<DecimalTest>(json, settings);
AssertAreEqual("0.0050000012852251529693603515625", result.stringValue, "stringValue");
AssertAreEqual(0.0050000012852251529693603516m, result.decimalValue, "decimalValue");
AssertAreEqual("0.0050000012852251529693603515625", result.bigDecimalValue.ToString(), "bigDecimalValue");
Console.WriteLine("All tests passed.");
public static void AssertAreEqual<T>(T expected, T actual, string name = null)
if (!expected.Equals(actual))
throw new Exception("Asserting '" + (name) + "' failed. Expected: " + expected + ", actual: " + actual);
public string stringValue { get; set; }
public decimal decimalValue { get; set; }
public BigDecimal bigDecimalValue { get; set; }
public string Value { get; set; }
public static BigDecimal Parse(string str)
return new BigDecimal { Value = str };
public class JsonBigDecimalConverter : JsonConverter
public override bool CanConvert(Type objectType)
return (objectType == typeof(BigDecimal));
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
var token = JToken.Load(reader);
return BigDecimal.Parse(token.ToString());
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();