ServiceStack序列化long int值

时间:2016-05-10 04:46:03

标签: servicestack servicestack-text

我有一个对象,其属性定义为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。

1 个答案:

答案 0 :(得分:2)

JSON Serializer按预期工作:

$scope.items = JSON.parse(data.data);

JSON服务响应也是如此,您可以通过添加var json = "{\"Timestamp\":635980054734850470}"; var dto = json.FromJson<TimestampData>(); dto.ToJson().Print(); //= {"Timestamp":635980054734850470} 来查看,例如:

.json

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

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

/timestamp.json

创建一个包含以下内容的JavaScript对象:

var model = {"Timestamp":635980054734850470};

这是因为JavaScript中的数字存储为highest integer it can store without losing precision{Timestamp: 635980054734850400} 的双精度数,因为它小于9007199254740992,最终会失去一些精度。