如何使用ServiceStack JsonSerializer正确解析JSON小数

时间:2013-09-19 11:17:15

标签: c# json decimal servicestack

我有以下情况:

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(使用指数等)

1 个答案:

答案 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; }
}

可以在DeserializeBuiltin

中找到原因
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);