38

我已经使用 Newtonsoft 的 JSON 序列化器序列化了一个对象,并且 DateTime 已经通过:

/Date(1237588418563+0000)/

当我使用 $.evalJSON() 时,它是一个对象,但我找不到任何正常的 Date 方法,例如 toUTCString 。

有什么想法我能用这个做什么?

4

7 回答 7

80

使用 Json.NET 附带的其中一个 JsonConverter 来处理日期以获得更好的格式。JavaScriptDateTimeConverter 会自动给你一个 JavaScript 日期。

public class LogEntry    
{    
  public string Details { get; set; }    
  public DateTime LogDate { get; set; }
}

[Test]
public void WriteJsonDates()
{    
  LogEntry entry = new LogEntry    
  {    
    LogDate = new DateTime(2009, 2, 15, 0, 0, 0, DateTimeKind.Utc),    
    Details = "Application started."    
  };    


  string defaultJson = JsonConvert.SerializeObject(entry);    
  // {"Details":"Application started.","LogDate":"\/Date(1234656000000)\/"}     

  string javascriptJson = JsonConvert.SerializeObject(entry, new JavaScriptDateTimeConverter());    
  // {"Details":"Application started.","LogDate":new Date(1234656000000)}

  string isoJson = JsonConvert.SerializeObject(entry, new IsoDateTimeConverter());    
  // {"Details":"Application started.","LogDate":"2009-02-15T00:00:00Z"}    
}

文档:使用 Json.NET 在 JSON 中序列化日期

于 2009-05-30T06:26:25.060 回答
16

我想出了一种不同的方法,可能对某些人有用。基本上我创建了我自己的CustomDateConverter,我需要它时调用它。转换器采用 2 个参数,一个日期格式,例如yyyy-MM-dd HH:mm:ss和一个 TimeZoneInfo,它允许我将日期从 UTC 转换为用户的时区:

public class JSONCustomDateConverter : DateTimeConverterBase
{
    private TimeZoneInfo _timeZoneInfo;
    private string _dateFormat;

    public JSONCustomDateConverter(string dateFormat, TimeZoneInfo timeZoneInfo)
    {
        _dateFormat = dateFormat;
        _timeZoneInfo = timeZoneInfo;
    }
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(DateTime);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteValue(TimeZoneInfo.ConvertTimeFromUtc(Convert.ToDateTime(value), _timeZoneInfo).ToString(_dateFormat));
        writer.Flush();
    }

你可以像这样使用它:

 var jsonString = JsonConvert.SerializeObject(myObject, Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Converters = new List<JsonConverter>() { new JSONCustomDateConverter("yyyy-MM-dd HH:mm:ss", loggedUser.Timezone) } });

显然,如果您只想要自定义日期格式,则可以删除与时区相关的任何内容。让我知道这有帮助!

于 2012-08-15T11:45:18.137 回答
15

从 Newtonsoft Json.Net 4.5r5 版开始,您使用 JsonPropertyAttribute Class 类并设置其 ItemConverterType Property 属性。用法:

// class to be serialized
public class MyClass
{
    [JsonProperty(ItemConverterType = typeof(JavaScriptDateTimeConverter))]
    public DateTime? DateTime1;
    public DateTime? DateTime2;
}

正如我所观察到的,这将为此类中的所有属性设置 DateTimeConverter,而不仅仅是之前声明的属性。

于 2012-05-12T08:43:05.143 回答
3

遇到同样的问题,并根据 Adam 的链接找到了解决方案:

new Date(yourDate.substr(yourDate.indexOf("(") + 1, 13) - 0));

它看起来像一个 Unix 时间戳,javascript 很容易将其转换为日期对象。这- 0只是让javascript将substr输出视为整数......我想你也可以Number(),如果你不喜欢它的外观- 0

于 2010-11-11T13:04:59.877 回答
1

JSON 对象包含如下内容:

var data = {"CreatedDate":"/Date(1327572000000-1000)/"});

 ///
var oddDateTimeZone = data.CreatedDate;
var utcDateTime = oddDateTimeZone.substr(oddDateTimeZone.indexOf("(")+1, 13);
var utcZone = oddDateTimeZone.substr(oddDateTimeZone.indexOf("-")+1, 4);
var utcDateTimeZone = new Date(Number(utcDateTime)-(Number(utcZone)));

但是,最好还是修复 JSON 对象,以便在不使用类似 eval() 或 window[] 的情况下触发日期函数。也许在 jQuery 中。没有把握。

不要忘记偏移量可能+不仅仅是-偏移量!

于 2012-02-04T23:42:56.643 回答
-1

抱歉,我简化了一点@James Newton-King

string date = Newtonsoft.Json.JsonConvert.SerializeObject(DateTime.Now);    
于 2014-09-09T15:45:43.243 回答
-2
ObjectMapper mapper = new ObjectMapper();

mapper.registerModule(new JavaTimeModule());

mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

这对我有用

于 2016-02-04T15:36:17.807 回答