C# 反序列化,支持基本数据类型处理

C# 反序列化,支持基本数据类型处理

代码

    public class ConvertUtils
    {
        /// <summary>
        /// 对象映射
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="formatting"></param>
        /// <param name="settings"></param>
        /// <returns></returns>
        public static T Mapper<T>(object obj)
        {
            var json = ToJsonString(obj);
            return Parse<T>(json);
        }

        /// <summary>
        /// 优化对基本数据类型和空指针的支持
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="formatting"></param>
        /// <param name="settings"></param>
        /// <returns></returns>
        public static T Parse<T>(string json, JsonSerializerSettings settings = null)
        {
            if (typeof(T) == typeof(string))
            {
                return (T)(object)json;
            }
            if (string.IsNullOrWhiteSpace(json) || "null".Equals(json, StringComparison.OrdinalIgnoreCase))
            {
                return default(T);
            }
            //if(typeof(IConvertible).IsAssignableFrom(typeof(T)))
            if (typeof(DateTime).IsAssignableFrom(typeof(T)))
            {
                return (T)(object)Convert.ToDateTime(json);
            }
            if (typeof(int).IsAssignableFrom(typeof(T)))
            {
                return (T)(object)Convert.ToInt32(json);
            }
            if (typeof(long).IsAssignableFrom(typeof(T)))
            {
                return (T)(object)Convert.ToInt64(json);
            }
            if (typeof(float).IsAssignableFrom(typeof(T)))
            {
                return (T)(object)Convert.ToSingle(json);
            }
            if (typeof(double).IsAssignableFrom(typeof(T)))
            {
                return (T)(object)Convert.ToDouble(json);
            }
            if (typeof(decimal).IsAssignableFrom(typeof(T)))
            {
                return (T)(object)Convert.ToDecimal(json);
            }
            if (typeof(bool).IsAssignableFrom(typeof(T)))
            {
                return (T)(object)Convert.ToBoolean(json);
            }
            if (typeof(byte).IsAssignableFrom(typeof(T)))
            {
                return (T)(object)Convert.ToByte(json);
            }
            if (typeof(char).IsAssignableFrom(typeof(T)))
            {
                return (T)(object)Convert.ToChar(json);
            }
            if (typeof(ushort).IsAssignableFrom(typeof(T)))
            {
                return (T)(object)Convert.ToUInt16(json);
            }
            if (typeof(uint).IsAssignableFrom(typeof(T)))
            {
                return (T)(object)Convert.ToUInt32(json);
            }
            if (typeof(ulong).IsAssignableFrom(typeof(T)))
            {
                return (T)(object)Convert.ToUInt64(json);
            }
            if (typeof(sbyte).IsAssignableFrom(typeof(T)))
            {
                return (T)(object)Convert.ToSByte(json);
            }
            if (typeof(IConvertible[]).IsAssignableFrom(typeof(T)) || typeof(IEnumerable).IsAssignableFrom(typeof(T)))
            {
                if (!json.Contains("["))
                {
                    return Parse<T>(ToJsonString(json.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)));
                }
            }
            if (settings == null)
            {
                return JsonConvert.DeserializeObject<T>(json);
            }
            return JsonConvert.DeserializeObject<T>(json, settings);
        }

        /// <summary>
        /// 优化对字符串等基本数据类型和空指针的支持
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="formatting"></param>
        /// <param name="settings"></param>
        /// <returns></returns>
        public static string ToJsonString(object obj, Formatting formatting = Formatting.None, JsonSerializerSettings settings = null)
        {
            if (obj == null)
            {
                return string.Empty;
            }
            if (obj is string)
            {
                return obj as string;
            }
            if (typeof(IConvertible).IsAssignableFrom(obj.GetType()))
            {
                return Convert.ToString(obj);
            }
            if (settings == null)
            {
                return JsonConvert.SerializeObject(obj, formatting);
            }
            return JsonConvert.SerializeObject(obj, formatting, settings);
        }
        
        public static T[] ListToArray<T>(IList<T> list)
        {
            if (list == null || list.Count < 1)
            {
                return new T[0];
            }
            T[] arr = new T[list.Count];
            for (int i = 0; i < arr.Length; i++)
            {
                arr[i] = list[i];
            }
            return arr;
        }

        public static IList<T> ArrayToList<T>(T[] arr)
        {
            IList<T> list = new List<T>();
            if (arr == null)
            {
                return list;
            }
            for (int i = 0; i < arr.Length; i++)
            {
                list.Add(arr[i]);
            }
            return list;
        }

    }
posted @   明月心~  阅读(71)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示