long int值的ServiceStack序列化

ServiceStack serialisation of long int value

我有一个对象,其属性定义为 long 并且确切值为 635980054734850470 但是当它被序列化时 JSON 输出给我 635980054734850400

它似乎一直在删除最后两位数字值,而不是给我确切的值。这有什么原因吗?

这是示例 C# 代码:

[Route("/timestamp", Verbs = "GET")]
public class GetTimestamp : IReturn<TimestampData>
{

}

public class TimestampData 
{ 
    public long Timestamp { get; set; }
}

public class TimestampService : CustomerServiceBase
{
    public object Get(GetTimestamp request)
    {
        var timestamp = DateTime.UtcNow.Ticks;
        Console.WriteLine(timestamp);
        return new TimestampData() { Timestamp = timestamp };
    }
}

示例输出:

{"Timestamp":635984646884003500}

注意输出总是四舍五入到最接近的 100。

JSON 序列化程序按预期工作:

var json = "{\"Timestamp\":635980054734850470}";
var dto = json.FromJson<TimestampData>();
dto.ToJson().Print(); //= {"Timestamp":635980054734850470}

JSON 服务响应也是如此,您可以通过添加 .json 查看,例如:

/timestamp.json

或在 Web Inspector、Fiddler 或其他数据包检查器中查看响应。

我唯一一次看到它四舍五入是在 ServiceStack 的自动 HTML5 Report Format 页面中,它将 JSON 响应解析为 JavaScript 对象,例如:

var model = {"Timestamp":635980054734850470};

这会创建一个 JavaScript 对象,其中包含:

{Timestamp: 635980054734850400}

这是因为 JavaScript 中的数字存储为双精度,而 highest integer it can store without losing precision9007199254740992,因为它小于 635980054734850470,它最终会失去一些精度。