Newtonsoft.Json 自定义序列化特性

目前在项目中经常使用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;
        }
    }


 



Newtonsoft.Json是一个流行的.NET JSON框架,用于在JSON格式和.NET对象之间进行序列化和反序列化。要序列化类中的私有字段,通常需要使用一些额外的技巧,因为默认情况下,Newtonsoft.Json不会序列化私有字段。 一种方法是使用自定义的`JsonConverter`,这个转换器可以让你控制序列化和反序列化的过程。以下是一个简单的自定义`JsonConverter`示例,它允许序列化私有字段: ```csharp using Newtonsoft.Json; using System; using System.Reflection; public class PrivateFieldConverter : JsonConverter { public override bool CanConvert(Type objectType) { return true; } 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) { var type = value.GetType(); writer.WriteStartObject(); foreach (FieldInfo fieldInfo in type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)) { object obj = fieldInfo.GetValue(value); var attribute = fieldInfo.GetCustomAttribute<JsonPropertyAttribute>(); var name = attribute != null ? attribute.PropertyName : fieldInfo.Name; serializer.Serialize(writer, name, obj); } writer.WriteEndObject(); } } public class MyObject { [JsonProperty] private int privateField; } ``` 在这个示例中,`PrivateFieldConverter`类覆盖了`WriteJson`方法来遍历所有非公共字段,并使用`JsonSerializer`来序列化它们。`MyObject`类中的私有字段`privateField`通过`JsonProperty`属性标记,以便`PrivateFieldConverter`能够找到并序列化它。 要使用这个转换器,你需要在序列化时指定它: ```csharp var settings = new JsonSerializerSettings { Converters = new List<JsonConverter> { new PrivateFieldConverter() } }; var obj = new MyObject { privateField = 42 }; string json = JsonConvert.SerializeObject(obj, settings); ``` 这样,即使是私有字段也会被包含在序列化JSON字符串中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值