2

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

我尝试构建一个不错的小类,但输出用引号括起来,这是行不通的。

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

1 回答 1

4

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

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

  • 一个字符串,例如"abc"
  • 一个数字,例如123-12.34
  • true, false, 或的文字值null
  • 其他有效值的数组,例如[1,"a",true]
  • 另一个 JSON 对象,例如{ a: 1, b: "abc" }

它不能只是一个JavaScript Object或任何其他任意 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,因此从他们的参考资料中可以看出,他们使用的是一种看起来像构造函数的非标准格式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);
        }
    }
}
于 2013-09-30T22:53:24.247 回答