1

我有以下情况:

var json = "{\"AccruedInterest\":9.16666666666666E-6}";
var result = JsonSerializer.DeserializeFromString<MyResult>(json);
Assert.That(result .AccruedInterest, Is.GreaterThan(0m));

whereMyResult将字段声明AccruedInterestdecimal

上述测试设置AccruedInterest为 0,因此失败。如果我将 JSON 设置为具有指数的应计利息值以外的任何值,则测试有效。

将 JSON 字符串转换为小数的 ServiceStack JSON 处理是否损坏?以上似乎是完全有效的 JSON(使用指数等)

4

1 回答 1

3

如果您将类上的类型切换MyResult为 a 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);
于 2013-09-19T17:17:10.687 回答