JSON.NET 序列化日期
本文关键字:日期 序列化 NET JSON | 更新日期: 2023-09-27 18:33:20
我想将我的日期序列化为特定格式,但我无法将我的行为放在一起。
我尝试构建一个不错的小类,但输出被括在引号中,这不起作用。
我希望 JSON 看起来像这样...
{
date : new Date(2013, 8, 30)
}
但我明白了...
{
date: "new Date(2013, 8, 30)"
}
我的班级
public class DateCell : ChartCell
{
[JsonIgnore]
public DateTime Value { get; set; }
[JsonProperty(PropertyName = "date")]
public override object DataValue
{
get
{
return string.Format("new Date({0}, {1}, {2})", this.Value.Year, this.Value.Month - 1, this.Value.Day);
}
}
}
JavaScript
对象和 JSON 之间是有区别的。 您描述的内容在 JavaScript 对象中可能有效,但它不是有效的 JSON。 JSON 不允许你请求的表示形式。
在 JSON 中,值只能是以下值之一:
- 字符串,例如
"abc"
- 数字,例如
123
或-12.34
- 文本值为
true
、false
或null
- 其他有效值的数组,例如
[1,"a",true]
- 另一个 JSON 对象,例如
{ a: 1, b: "abc" }
它不能只是一个 JavaScript 对象,或任何其他任意的 JavaScript。 请参阅 json.org 的规格。
传递Date
对象构造函数没有任何意义,因为 JSON 是一种通用的序列化格式,而 Date
是一种 JavaScript 本机类。 你期望非JavaScript代码如何解释这一点?
虽然JSON标准没有定义特定的日期或时间格式,但事实上的标准是ISO 8601格式。 您的DateTime
看起来像"2013-09-30T00:00:00"
. 还有其他方法可以序列化日期,但它们不那么统一或流行。
在 JSON.Net 中,ISO 8601 格式是默认格式。 因此,除了使用对象的原始属性序列化对象之外,您不需要执行任何特殊操作。
public class DateCell : ChartCell
{
public DateTime Value { get; set; }
}
更新
由于您在评论中说您要将其传递给 Google 图表,因此从他们的参考资料来看,他们使用的是看起来像 Date
构造函数的非标准格式,但省略了 new
关键字。 他们为什么这样做,我不确定,但你应该能够修改你的原始代码,如下所示:
public class DateCell : ChartCell
{
[JsonIgnore]
public DateTime Value { get; set; }
[JsonProperty(PropertyName = "date")]
public override object DataValue
{
get
{
return string.Format("Date({0},{1},{2})", this.Value.Year, this.Value.Month - 1, this.Value.Day);
}
}
}