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;
}
}