从Newtonsoft的JSON Serializer解析JSON DateTime

时间:2009-03-21 00:48:58

标签: json datetime parsing json.net

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

/Date(1237588418563+0000)/

当我使用$ .evalJSON()时,它是一个对象,但是我找不到像toUTCString这样的普通Date方法。

我能用这个做什么想法?

7 个答案:

答案 0 :(得分:78)

使用Json.NET附带的JsonConverters之一来处理日期以获得更好的格式。 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"}    
}

文档:Serializing Dates in JSON with Json.NET

答案 1 :(得分: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) } });

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

答案 2 :(得分:15)

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

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

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

答案 3 :(得分:2)

遇到同样的问题,找到了一个基于Adam链接的解决方案:

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

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

答案 4 :(得分: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中。不确定。

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

答案 5 :(得分:-1)

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

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

答案 6 :(得分:-1)

public void UpdateInstance(string scope, string query, string parametersJSON)
        {
            WindowsImpersonationContext impersonatedUser = WindowsIdentity.GetCurrent().Impersonate();

            JavaScriptSerializer serializer = new JavaScriptSerializer();
            object result = serializer.Deserialize(parametersJSON, typeof(object));

            Dictionary<string, object> dic = (Dictionary<string, object>)result;

            ManagementObjectSearcher searcher;
            searcher = new ManagementObjectSearcher(scope, query);

            EnumerationOptions options = new EnumerationOptions();
            options.ReturnImmediately = true;

            foreach (ManagementObject m in searcher.Get())
            {
                foreach (KeyValuePair<string, object> k in dic)
                {
                    m.Properties[k.Key].Value = k.Value;
                }

                m.Put();
            }
        }

这对我有用