JSON.NET序列化日期

时间:2013-09-30 22:43:24

标签: c# json.net

我想将我的日期序列化为特定格式,但我无法一起行动。

我尝试构建一个漂亮的小类,但输出包含在引号中,这不起作用。

我希望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);
        }
    }
}

1 个答案:

答案 0 :(得分:4)

JavaScript Object和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 Charts,因此from their reference显示他们使用的非标准格式看起来像<{1}}构造函数,但是省略了Date关键字。为什么他们这样做,我不确定,但您应该能够修改原始代码,如下所示:

new