Newtonsoft.Json 自定义序列化特性

来源:互联网 发布:显示器测试软件 编辑:程序博客网 时间:2024/06/06 17:42

目前在项目中经常使用Newtonsoft.Json,因项目需要对其中的特定数据类型序列化有特殊要求,特地学习了下如何对Newtonsoft.Json的序列化进行自定义扩展开发。

1、对DateTime类型,序列化输出为时间戳;

2、对string类型,序列化输出为Unicode字符。

针对需求1的序列化扩展特性代码:

/// <summary>    /// Newtonsoft.Json序列化扩展特性    /// <para>DateTime序列化(输出为时间戳)</para>    /// </summary>    public class TimestampConverter : JsonConverter    {        public override bool CanConvert(Type objectType)        {            return objectType == typeof(DateTime);        }        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)        {            return ConvertDateTime.ConvertIntDateTime(int.Parse(reader.Value.ToString()));        }        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)        {            writer.WriteValue(ConvertDateTimeInt((DateTime)value));        }        public static DateTime ConvertIntDateTime(int aSeconds)        {            return new DateTime(1970, 1, 1).AddSeconds(aSeconds);        }        public static int ConvertDateTimeInt(DateTime aDT)        {            return (int)(aDT - new DateTime(1970, 1, 1)).TotalSeconds;        }    }


针对需求2的序列化扩展特性代码:

/// <summary>    /// Newtonsoft.Json序列化扩展特性    /// <para>String Unicode 序列化(输出为Unicode编码字符)</para>    /// </summary>    public class UnicodeConverter : JsonConverter    {        public override bool CanConvert(Type objectType)        {            return objectType == typeof(string);        }        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)        {            return reader.Value;        }        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)        {            writer.WriteValue(ToUnicode(value.ToString()));        }        public static string ToUnicode(string str)        {            byte[] bts = Encoding.Unicode.GetBytes(str);            string r = "";            for (int i = 0; i < bts.Length; i += 2)            {                r += "\\u" + bts[i + 1].ToString("X").PadLeft(2, '0') + bts[i].ToString("X").PadLeft(2, '0');            }            return r;        }    }

使用方式:

public class Base    {        [JsonConverter(typeof(TimestampConverter))]        public DateTime ExpiresTime        {            get;set;        }        [JsonConverter(typeof(UnicodeConverter))]        public string Name        {            get;set;        }    }





0 0
原创粉丝点击