从Newtonsoft';s JSON序列化程序

从Newtonsoft';s JSON序列化程序,json,datetime,parsing,json.net,Json,Datetime,Parsing,Json.net,我使用Newtonsoft的JSON序列化程序序列化了一个对象,日期时间如下: /Date(1237588418563+0000)/ 当我在上面输入$.evalJSON()时,它是一个对象,但在它上面找不到任何像toutString这样的普通日期方法 有什么办法吗?使用Json.NET附带的一个JSONConverter处理日期以获得更好的格式。JavaScriptDateTimeConverter将自动为您提供JavaScript日期 public class LogEntry {

我使用Newtonsoft的JSON序列化程序序列化了一个对象,日期时间如下:

/Date(1237588418563+0000)/
当我在上面输入$.evalJSON()时,它是一个对象,但在它上面找不到任何像toutString这样的普通日期方法


有什么办法吗?

使用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"}    
}

文档:

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

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

它看起来像Unix时间戳,javascript可以轻松地将其转换为日期对象。
-0
只是让javascript将
substr
输出视为一个整数。。。如果您不喜欢
-0

的外观,我想您也可以
Number()
它,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)));
 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) } });
但是,仍然最好修复JSON对象,以便在不使用eval()或window[]之类的东西的情况下启动日期函数。也许在jQuery中。不确定


不要忘记偏移量可以是
+
,而不仅仅是偏移量的
-

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


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

我提出了一种可能对某些人有用的不同方法。基本上,我创建自己的CustomDateConverter,在需要时调用它。转换器有两个参数,一个是日期格式,例如
yyy-MM-dd HH:MM:ss
,另一个是时区信息,它允许我将日期从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 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)));
 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) } });
var jsonString=JsonConvert.SerializeObject(myObject,Formatting.None,new JsonSerializerSettings{NullValueHandling=NullValueHandling.Ignore,Converters=new List(){new JSONCustomDateConverter(“yyyy-MM-dd HH:MM:ss”,loggedUser.Timezone)});

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

对不起,我简化了一点@James Newton King

string date = Newtonsoft.Json.JsonConvert.SerializeObject(DateTime.Now);    

这对我有用

这对你有用吗?:作为参考,IsoDateTimeConverter上的名称空间是Newtonsoft.Json.converts,而JsonConvert.SerializeObject上的名称空间是Newtonsoft.Json。这个答案是最新的。我不认为我理解这应该做什么,或者它应该如何工作。在我的类中,我有以下内容:[JsonProperty(ItemConverterType=typeof(IsoDateTimeConverter))]public System.DateTime RecordInsertedDate{get;set;}但是我的日期仍然是默认的/Date(1324565600000)/formatNVM,我使用的ServiceStack覆盖了它。您必须使用ServiceStack的JsConfig.DateHandler=DateHandler.ISO8601;要获取ISO8601,代码中的配置设置您还可以使用正则表达式,然后像这样计算文本:
eval(“new”+data.CreateDate.replace(//\//ig,”)
如果有人希望通过在Asp.Net MVC上全局注册来扩展它,那么它似乎工作得很好。
services.AddMvc().AddJsonOptions(jsonOption=>{jsonOption.SerializerSettings.Converters.Add(新的JSONCustomDateConverter(“dd/mm/yyy”,TimeZoneInfo.FindSystemTimeZoneById(“印度标准时间”));};
对象映射器究竟是什么?