Newtonsoft.Json 时间格式化问题

1.WPF加载时进行全局设置

 Newtonsoft.Json.JsonSerializerSettings setting = new Newtonsoft.Json.JsonSerializerSettings();
            JsonConvert.DefaultSettings = new Func<JsonSerializerSettings>(() =>
            {
                setting.DateFormatHandling = Newtonsoft.Json.DateFormatHandling.MicrosoftDateFormat;
                setting.DateFormatString = "yyyy-MM-dd HH:mm:ss";
                return setting;
            });

2.Newtonsoft.Json 序列化和反序列化 时间格式

链接:http://www.cnblogs.com/litian/p/3870975.html

1.JSON序列化

string JsonStr= JsonConvert.SerializeObject(Entity);

eg:

A a=new A();

a.Name="Elain00";

a.Hobby="eat eat";

string jsonStr=JsonConvert.SerializeObject(a);

2.JSON反序列化

string jsonstr = "jsonString";
Class model = JsonConvert.DeserializeObject<Class>(jsonstr);

eg:

string JsonStr=‘"{\‘Name\‘:\‘Elaine00\‘,\‘Hobby\‘:\‘eat eat\‘}";
A a=JsonConvert.DeserializeObject<A>(JsonStr);

 3.时间格式处理

 IsoDateTimeConverter timeFormat = new IsoDateTimeConverter();
                    timeFormat.DateTimeFormat = "yyyy-MM-dd HH:mm:ss";
                    Response.Write(JsonConvert.SerializeObject(bll.GetModelList(strWhere), Newtonsoft.Json.Formatting.Indented, timeFormat));

 4.扩展方法

public static class NewtonJSONHelper
    {
        public static string SerializeObject(this object obj)
        {
            return JsonConvert.SerializeObject(obj, Formatting.Indented, new JsonSerializerSettings{
                ReferenceLoopHandling = ReferenceLoopHandling.Ignore});
        }

        public static T DeserializeObject<T>(this string data)
        {
            return JsonConvert.DeserializeObject<T>(data, new JsonSerializerSettings
            {
                ReferenceLoopHandling = ReferenceLoopHandling.Ignore
            });
        }
    }

5.日期处理

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

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

  // default as of Json.NET 4.5
  string isoJson = JsonConvert.SerializeObject(entry);
  // {"Details":"Application started.","LogDate":"2009-02-15T00:00:00Z"}

  JsonSerializerSettings microsoftDateFormatSettings = new JsonSerializerSettings
  {
    DateFormatHandling = DateFormatHandling.Micro

public class LimitPropsContractResolver : DefaultContractResolver
    {
        private string[] props = null;

        public LimitPropsContractResolver(string[] props)
        {
            this.props = props;
        }

        protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
        {
            IList<JsonProperty> list = base.CreateProperties(type, memberSerialization);
            IsoDateTimeConverter iso = new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" };
            IList<JsonProperty> listWithConver = new List<JsonProperty>();
            foreach (var item in list)
            {
                if (props.Contains(item.PropertyName))
                {
                    if (item.PropertyType.ToString().Contains("System.DateTime"))
                    {
                        item.Converter = iso;
                    }
                    listWithConver.Add(item);
                }
            }
            return listWithConver;
        }
    }
}

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

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

2.JSON反序列化

string jsonstr = "jsonString";
Class model = JsonConvert.DeserializeObject<Class>(jsonstr);

eg:

string JsonStr=‘"{\‘Name\‘:\‘Elaine00\‘,\‘Hobby\‘:\‘eat eat\‘}";
A a=JsonConvert.DeserializeObject<A>(JsonStr);

一般是对于值类型的处理,通过设置jSetting.DefaultValueHandling的值来确定,该值为枚举类型.

DefaultValueHandling.Ignore
序列化和反序列化时,忽略默认值
DefaultValueHandling.Include
序列化和反序列化时,包含默认值

给成员设置默任值,用到"DefaultValue(value)"特性,当然别忘了引入命名空间"System.ComponentModel",假设员工的年龄默认值为30

        [DefaultValue(30)]
        public int Age { get; set; }

序列化时我想忽略为默认值的成员

            Staff jack = new Staff { Name = "Jack", Age = 30, Gender = "Male", DepartmentName = "Personnel Department", Leader = null };
            var jSetting = new JsonSerializerSettings();
            jSetting.DefaultValueHandling = DefaultValueHandling.Ignore;
            string json = JsonConvert.SerializeObject(jack,jSetting);
            Console.WriteLine(json);

结果:

3.忽略某些属性

首先介绍Json.Net序列化的模式:OptOut 和 OptIn.

OptOut 默认值,类中所有公有成员会被序列化,如果不想被序列化,可以用特性JsonIgnore
OptIn 默认情况下,所有的成员不会被序列化,类中的成员只有标有特性JsonProperty的才会被序列化,当类的成员很多,但客户端仅仅需要一部分数据时,很有用

假如客户仅仅需要员工的姓名,此时

    [JsonObject(Newtonsoft.Json.MemberSerialization.OptIn)]
    public class Staff
    {
        [JsonProperty]
        public string Name { get; set; }
        public int Age { get; set; }
        public string Gender { get; set; }
        public string DepartmentName { get; set; }
        public Staff Leader { get; set; }
    }

序列化:

            Staff jack = new Staff { Name = "Jack", Age = 30, Gender = "Male", DepartmentName = "Personnel Department", Leader = null };
            string json = JsonConvert.SerializeObject(jack);

结果:

如果客户不想要员工的领导信息

    public class Staff
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public string Gender { get; set; }
        public string DepartmentName { get; set; }
        [JsonIgnore]
        public Staff Leader { get; set; }
    }

序列化:

            Staff tom = new Staff { Name = "Tome", Age = 42, Gender = "Male", DepartmentName = "Personnel Department"};
            Staff jack = new Staff { Name = "Jack", Age = 30, Gender = "Male", DepartmentName = "Personnel Department", Leader = tom };
            string json = JsonConvert.SerializeObject(jack);
            Console.WriteLine(json);

结果:

4.支持非公共成员

Json.Net序列化对象时,默认情况下仅仅序列化公有成员,如果想要非公有成员也被序列化,就要在该成员上加特性"JsonProperty"

5.日期处理

  JsonConverters会在序列化和反序列化时被用到。JsonConverters允许手动对Json的控制。当Json的结构很复杂和你想改变一个类型怎么样被序列化时,这是非常有用的。当一个JsonConverters被添加到JsonSerializer时,它会检查每一要被序列化和反序列化的值,并返回CanConvert,如果为True,则JsonConverter读和写这个值;需要注意的是,虽然JsonConverter能够使你可以完全的控制Json的值,但是很多的Json.Net序列化的特性被限制,像是类型名称和引用处理。所有的JsonConvert都在命名空间 "Newtonsoft.Json.Converters"下

5.1IsoDateTimeConverter 和 JavaScriptDateTimeConverter

这是Json.Net中自带的两个处理日期的类,默认是IsoDateTimeConverter ,它的格式是"yyyy‘-‘MM‘-‘dd‘T‘HH‘:‘mm‘:‘ss.FFFFFFFK".另一个是JavaScriptTimeConverter,它的格式是 "new Date(ticks)",其实返回的是一个JavaScript的Date对象.
有两种方式来应用JsonConverter,改变Json序列化和反序列化的行为.

5.1.1如果你要序列化的日期格式是统一的,可以考虑如下方式

假设我们为员工添加两个日期类型的成员,出生日期和入职日期

    public class Staff
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public string Gender { get; set; }
        public string DepartmentName { get; set; }
        public Staff Leader { get; set; }
        public DateTime BirthDate { get; set; }
        public DateTime EmploymentDate { get; set; }
    }

我们的客户要求日期类型的成员返回javascript的日期对象

            Staff jack = new Staff { Name = "Jack", Age = 30, Gender = "Male",
                DepartmentName = "Personnel Department", BirthDate = new DateTime(1982,2,12), EmploymentDate = new DateTime(2010,12,12) };
            string json = JsonConvert.SerializeObject(jack,new JavaScriptDateTimeConverter());
            Console.WriteLine(json);

结果:

5.1.2如果想要不同的日期类型成员序列化后,以不同的形式显示.

现在我们的客户要求出生日期以"ISO"标准日期格式返回,入职日期以Javascript的Date对象格式返回,修改我们的员工类

    public class Staff
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public string Gender { get; set; }
        public string DepartmentName { get; set; }
        public Staff Leader { get; set; }
        [JsonConverter(typeof(IsoDateTimeConverter))]
        public DateTime BirthDate { get; set; }
        [JsonConverter(typeof(JavaScriptDateTimeConverter))]
        public DateTime EmploymentDate { get; set; }
    }

是的,通过特性"JsonConverter"来实现差异化的
序列化:

            Staff jack = new Staff { Name = "Jack", Age = 30, Gender = "Male",
                DepartmentName = "Personnel Department", BirthDate = new DateTime(1982,2,12), EmploymentDate = new DateTime(2010,12,12) };
            string json = JsonConvert.SerializeObject(jack);
            Console.WriteLine(json);

结果:

5.2自定义日期格式

客户现在提出要求,希望得到的日期格式是符合中国人习惯的格式.要求返回的格式是"2012年4月20日".挑战来了,没有挑战就没有进步,我喜欢挑战.光说是没有用的!先分析一下怎么解决这个问题.我考虑了两种思路.
  思路一:
研究了一下上面两个日期处理类,发现他们都是继承了基类"DateTimeConverterBase",所以我们可以参考"IsoDatetimeConverter"的实现方式,自己新建一个处理日期格式的转换器类.这种方式的缺点是可能要花大量的时间去研究,比较费时费力.优点就是可以对日期格式随心所欲的控制.
  思路二:
我又研究了一下"IsoDatetimeConverter",发现它的日期格式其实是由于内部DefaultDateTimeFormat = "yyyy‘-‘MM‘-‘dd‘T‘HH‘:‘mm‘:‘ss.FFFFFFFK"导致,而它也提供了修改日期样式的属性"DateTimeFormat",只要我们按照这种格式来写就OK了.

            Staff jack = new Staff { Name = "Jack", Age = 30, Gender = "Male",
                DepartmentName = "Personnel Department", BirthDate = new DateTime(1982,2,12), EmploymentDate = new DateTime(2010,12,12) };
            IsoDateTimeConverter dtConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy‘年‘MM‘月‘dd‘日‘" };
            string json = JsonConvert.SerializeObject(jack,dtConverter);
            Console.WriteLine(json);

结果:

6.FAQ

1.如何自定义序列化的字段名称?

默认情况下,Json.Net序列化后结果中的字段名称和类中属性的名称一致.如果想自定义序列化后的字段名称,可以使用JsonProperty.例如:

 public class Person
 {
       public int Id { get; set; }

       public string Name { get; set; }
 }

默认序列化的结果为: {"Id":1,"Name":"杨过"},如果不想用默认的字段名称,可以使用如下方式:

public class Person
{
       [JsonProperty(PropertyName = "PersonId")]
       public int Id { get; set; }

       [JsonProperty(PropertyName = "PersonName")]
       public string Name { get; set; }
}

这样序列化的结果为:{"PersonId":1,"PersonName":"杨过"}

时间: 2024-11-12 00:06:02

Newtonsoft.Json 时间格式化问题的相关文章

C# DataTable转json 时间格式化

1.NewTonSoft.json public static string DataTableToJson(DataTable dt) { if (dt == null && dt.Rows.Count <= 0) { return ""; } else { IsoDateTimeConverter convert = new IsoDateTimeConverter(); convert.DateTimeFormat = "yyyy-MM-dd HH

json时间格式化问题

1 function jsonDateFormat(jsonDate) {//json日期格式转换为正常格式 2 try { 3 var date = new Date(parseInt(jsonDate.replace("/Date(", "").replace(")/", ""), 10)); 4 var month = date.getMonth() + 1 < 10 ? "0" + (date

json时间格式化

//格式化日期字符串 String.prototype.jsonDateFormat = function (format) { var date, timestamp, dtObj timestamp = parseInt(this.toString().replace('/Date(', '').replace(')/', '').replace(/\+\d+/, ''), 10)// jsonDt.replace(/\/Date\((\d+)\)\//, "$1"); date

Newtonsoft.Json序列化字符串-格式化

转自:https://blog.csdn.net/wlphlj/article/details/51982866最近C#中需要将实体进行json序列化,使用了Newtonsoft.Json public static void TestJson()        {            DataTable dt = new DataTable();            dt.Columns.Add("Age", Type.GetType("System.Int32&quo

Newtonsoft.Json 序列化和反序列化 时间格式【转】

1.JSON序列化 string JsonStr= JsonConvert.SerializeObject(Entity); eg: A a=new A(); a.Name="Elain00"; a.Hobby="eat eat"; string jsonStr=JsonConvert.SerializeObject(a); 2.JSON反序列化 string jsonstr = "jsonString";Class model = JsonCo

Newtonsoft.Json 序列化和反序列化 时间格式

1.JSON序列化 string JsonStr= JsonConvert.SerializeObject(Entity); eg: A a=new A(); a.Name="Elain00"; a.Hobby="eat eat"; string jsonStr=JsonConvert.SerializeObject(a); 2.JSON反序列化 string jsonstr = "jsonString";Class model = JsonCo

Newtonsoft.Json同时对多个时间字段以不同的格式序列化

在博客园潜水多年,学到很多,也进步了很多,在这里说声谢谢,是时候给园友分享一点自己的东西,希望和大家一起进步. 之前有个需求要对一张表的多个时间字段进行不同的格式序列化, 在网上没找到相对较好的解决方案 就自己花了点时间研究了下,封装了下IsoDateTimeConverter这个类得以实现 不多说直接上源码 1 using Newtonsoft.Json.Converters; 2 using System; 3 using System.Collections.Generic; 4 usin

Newtonsoft.Json在转换指定时间格式时默认是UTC时间

最近做项目发现前台传入时间格式是/Date(1542893033449)/的时候,后台用Newtonsoft.Json发现竟然转换成了UTC时间,查阅了Newtonsoft.Json文档,发现如果需要转换成本地时区的时间需要按照以下写法 public void SetDate(string piple) { var x = new JsonSerializerSettings(); x.DateTimeZoneHandling = DateTimeZoneHandling.Local; var

JSON时间转换格式化(将数字时间转换为可视化的yyyy-MM-dd HH:mm:ss的格式)

参考: http://blog.csdn.net/u012992462/article/details/47042535 http://www.cnblogs.com/kissdodog/p/5419923.html 内容: 通常JSON时间一般是这样的格式. /Date(1436595149269)/ 通常我们用AJAX获取下来的JSON数据,如果有时间,都是这种格式的.其中,中间的一段数字"1436595149269"表示的是1970年1月1日至今的毫秒数. 这种时间格式并不能够直