【问题标题】:Using JSON to Serialize/Deserialize TimeSpan使用 JSON 序列化/反序列化 TimeSpan
【发布时间】:2011-03-15 01:06:23
【问题描述】:

我正在尝试使用Newtonsoft.Json.JsonConvert 反序列化/序列化时间跨度,但是当发送 JSON 时,它被设置为 00:00:00。

这有可能吗?

【问题讨论】:

  • 您使用哪个序列化程序? JavaScript序列化器? DataContractJsonSerializer?你能发布一个不起作用的小代码示例吗?
  • 我使用 Newtonsoft.json.jsonconvert。所以我要做的是。 JsonConvert.SerializeObject(TimeSpan);

标签: c# json web-services json.net


【解决方案1】:

我尝试了#Jessycormier 的方法,但它对我不起作用。 我运行 DataContractJsonSerializer 来查看它会生成什么,我发现它给了我一个看起来更像这样的值。

{"PassedTimeSpan":"P1DT2H3M4S"}

上面显示的值是 1 天 2 小时 3 分钟 4 秒。

所以看起来格式是:

[-]P[{days}D][T[{hours}H][{min}M][{sec}S]]

地点:

- 表示负时间跨度,正值省略
P 必须是第一个字符(除非是负时间值)
T 必须在时间跨度的时间部分之前。
[] = 如果为 0,则可以省略的可选部分。

【讨论】:

  • 感谢您写下通用模板!基于此,我可以编写下一个函数: formatTime = function (jsonTime) { var re = /-?P(?:\d+D)?(?:T(?:(\d+)H)?(( \d+)M)?((\d+)S)?)?/; var timeArray = re.exec(jsonTime); var h = timeArray[1] == 未定义? "" : timeArray[1]; var hr = "00" + h; var hour = hr.substr(hr.length - 2, 2); var m = timeArray[2] == 未定义? "" : timeArray[2]; var min = "00" + m; var min = min.substr(min.length - 2, 2);返回小时+“:”+分钟; }
  • 它返回给我Newtonsoft.Json.JsonSerializationException: 'Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.TimeSpan' because the type requires a JSON primitive value (e.g. string, number, boolean, null) to deserialize correctly.
  • @egoPinvina 试试 DataContractJsonSerializer
【解决方案2】:

我想通了,显然这是一个MS设计缺陷......

因为 TimeSpan 不能是无参数对象。 XML 无法重新创建它。

看看这个网站。 http://forums.silverlight.net/forums/p/51793/135450.aspx

所以。因此无法转换 TimeSpan。一个简单的方法是 将时间跨度更改为字符串,然后将字符串发送过来。 并使用 TimeSpan.TryParse(String);

【讨论】:

  • XML 与您的问题有什么关系?
  • @Crisfole 我认为他指的不是“XML”,而是他使用的任何序列化程序(其中很多都序列化为 XML 和 JSON)。
【解决方案3】:

这些答案都已经过时了,所以我想我会提供一个更新的更好的答案。 moment.js 现在直接支持.NET Timespan 序列化格式。

从 2.1.0 版开始,支持此功能:

moment.duration('23:59:59');
moment.duration('23:59:59.999');
moment.duration('7.23:59:59.999');
moment.duration('23:59'); // added in 2.3.0

【讨论】:

  • 我没有看到任何提及 moment.js 或任何 javascript 的内容。
【解决方案4】:

如果您应用确切的格式,您可以使用 TimeSpan。格式为:“0.00:00:00.0000”

将 TimeSpan 设置为 30 分钟

var jsonData = JSON.stringify({
    myDataObject: {
         TimeSpanValue : "0.00:" + $("#InputWithMinVal").val() + ":00.0"
    }
});

这个解决方案对我有用。我将 MVC 4.0 与 .Net 框架 4.0 一起使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 2012-09-05
    • 2014-11-27
    • 2019-11-17
    • 2020-10-23
    • 2015-11-22
    相关资源
    最近更新 更多