I have a class with an object property, if i create this class with a decimal value for the property and serialize it, that value looks fine:
var testObject = new TestObject{
TestDecimal = 8801203167395152041.7m
};
var serialized = Newtonsoft.Json.JsonConvert.SerializeObject(testObject);
serialized.Dump(); // returns {"TestDecimal":8801203167395152041.7}
However, if i try to deserialize this using a jtoken, the value becomes a scientific value and saved as a double, here is the entire code:
void Main()
{
var testObject = new TestObject{
TestDecimal = 8801203167395152041.7m
};
var serialized = Newtonsoft.Json.JsonConvert.SerializeObject(testObject);
serialized.Dump();
TestObject result = JsonConvert.DeserializeObject<TestObject>(serialized, new JsonSerializerSettings
{
Converters = new List<JsonConverter> { new TestDesiralizer() }
});
testObject.TestDecimal.Dump();
result.TestDecimal.Dump();
}
public class TestObject{
public object TestDecimal { get; set; }
}
public class TestDesiralizer : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(TestObject);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
serializer.Culture = CultureInfo.InvariantCulture;
reader.Culture = CultureInfo.InvariantCulture;
JToken token = serializer.Deserialize<JToken>(reader);
TestObject obj = token.ToObject<TestObject>();
obj.TestDecimal = decimal.Parse(Convert.ToString(obj.TestDecimal,CultureInfo.InvariantCulture) ?? "",NumberStyles.Any, CultureInfo.InvariantCulture);
return obj;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
This results in:
1) 8801203167395152041,7
2) 8801203167395150000
How do i keep the decimal value when deserializing the json?