加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Newtonsoft.Json 自定义序列化特性

发布时间:2020-12-16 18:59:02 所属栏目:百科 来源:网络整理
导读:目前在项目中经常使用Newtonsoft.Json,因项目需要对其中的特定数据类型序列化有特殊要求,特地学习了下如何对Newtonsoft.Json的序列化进行自定义扩展开发。 1、对DateTime类型,序列化输出为时间戳; 2、对string类型,序列化输出为Unicode字符。 针对需求1

目前在项目中经常使用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 ConvertIntDateTime((int)existingValue);
        }

        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)).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,JsonSerializer serializer)
        {
            return existingValue;
        }

        public override void WriteJson(JsonWriter writer,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;
        }
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读