当前位置:  开发笔记 > 编程语言 > 正文

从Newtonsoft的JSON Serializer解析JSON DateTime

如何解决《从Newtonsoft的JSONSerializer解析JSONDateTime》经验,为你挑选了3个好方法。

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

/Date(1237588418563+0000)/

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

我有什么想法可以做到这一点?



1> James Newton..:

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

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


作为参考,IsoDateTimeConverter上的命名空间是Newtonsoft.Json.Converters,而在JsonConvert.SerializeObject上则是Newtonsoft.Json

2> Johann..:

我提出了一种可能对某些人有用的不同方法.基本上我创建自己的CustomDateConverter,我需要它时调用它.转换器有2个参数,一个日期格式,例如yyyy-MM-dd HH:mm:ssTimeZoneInfo,它允许我将日期从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() { new JSONCustomDateConverter("yyyy-MM-dd HH:mm:ss", loggedUser.Timezone) } });

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


终于找到了正常的覆盖样本:)非常感谢

3> Anderson..:

从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,而不仅仅是声明之前的属性.

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有