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);
        }
    }
}

JSON.NET 序列化日期

JavaScript

对象和 JSON 之间是有区别的。 您描述的内容在 JavaScript 对象中可能有效,但它不是有效的 JSON。 JSON 不允许你请求的表示形式。

在 JSON 中,值只能是以下值之一:

  • 字符串,例如"abc"
  • 数字,例如123-12.34
  • 文本值为 truefalsenull
  • 其他有效值的数组,例如[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);
        }
    }
}