我有以下情况:
var json = "{\"AccruedInterest\":9.16666666666666E-6}";
var result = JsonSerializer.DeserializeFromString<MyResult>(json);
Assert.That(result .AccruedInterest, Is.GreaterThan(0m));
其中MyResult
将字段AccruedInterest
声明为decimal
上述测试将AccruedInterest
设置为0,因此失败。如果我使用指数将JSON设置为除应计利息值以外的任何其他值,则测试将起作用。
JSON字符串的ServiceStack JSON处理是否会损坏小数?以上似乎是完全有效的JSON(使用指数等)
答案 0 :(得分:3)
如果您将MyResult
课程的类型切换为float
,您将获得预期的结果:
public class Program
{
public static void Main(string[] args)
{
const string json = "{\"AccruedInterest\":9.16666666666666E-6}";
var result = JsonSerializer.DeserializeFromString<MyResult>(json);
}
}
public class MyResult
{
public float AccruedInterest { get; set; }
}
中找到原因
if (typeof(T) == typeof(decimal))
return value => decimal.Parse(value, CultureInfo.InvariantCulture);
如果您尝试自己解析,则会出现无效的格式异常。
decimal.Parse("9.16666666666666E-6", CultureInfo.InvariantCulture);
如果指定浮点数的样式,则异常将消失。
decimal.Parse("9.16666666666666E-6", NumberStyles.Float, CultureInfo.InvariantCulture);
同样将其解析为浮点数:
float.Parse("9.16666666666666E-6", CultureInfo.InvariantCulture);