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 precision 是 9007199254740992
,因为它小于 635980054734850470
,它最终会失去一些精度。
我有一个对象,其属性定义为 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 precision 是 9007199254740992
,因为它小于 635980054734850470
,它最终会失去一些精度。