using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EntrustSettle.Common.Helper { /// /// /// 大数据json序列化重写 /// public sealed class NumberConverter : JsonConverter { /// /// 转换成字符串的类型 /// private readonly NumberConverterShip _ship; /// /// 大数据json序列化重写实例化 /// public NumberConverter() { _ship = (NumberConverterShip)0xFF; } /// /// 大数据json序列化重写实例化 /// /// 转换成字符串的类型 public NumberConverter(NumberConverterShip ship) { _ship = ship; } /// /// /// 确定此实例是否可以转换指定的对象类型。 /// /// 对象的类型。 /// 如果此实例可以转换指定的对象类型,则为:true,否则为:false public override bool CanConvert(Type objectType) { var typecode = Type.GetTypeCode(objectType.Name.Equals("Nullable`1") ? objectType.GetGenericArguments().First() : objectType); switch (typecode) { case TypeCode.Decimal: return (_ship & NumberConverterShip.Decimal) == NumberConverterShip.Decimal; case TypeCode.Double: return (_ship & NumberConverterShip.Double) == NumberConverterShip.Double; case TypeCode.Int64: return (_ship & NumberConverterShip.Int64) == NumberConverterShip.Int64; case TypeCode.UInt64: return (_ship & NumberConverterShip.UInt64) == NumberConverterShip.UInt64; case TypeCode.Single: return (_ship & NumberConverterShip.Single) == NumberConverterShip.Single; default: return false; } } /// /// /// 读取对象的JSON表示。 /// /// 中读取。 /// 对象的类型。 /// 正在读取的对象的现有值。 /// 调用的序列化器实例。 /// 对象值。 public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { return AsType(reader.Value.ObjToString(), objectType); } /// /// 字符串格式数据转其他类型数据 /// /// 输入的字符串 /// 目标格式 /// 转换结果 public static object AsType(string input, Type destinationType) { try { var converter = TypeDescriptor.GetConverter(destinationType); if (converter.CanConvertFrom(typeof(string))) { return converter.ConvertFrom(null, null, input); } converter = TypeDescriptor.GetConverter(typeof(string)); if (converter.CanConvertTo(destinationType)) { return converter.ConvertTo(null, null, input, destinationType); } } catch { return null; } return null; } /// /// /// 写入对象的JSON表示形式。 /// /// 要写入的 。 /// 要写入对象值 /// 调用的序列化器实例。 public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { if (value == null) { writer.WriteNull(); } else { var objectType = value.GetType(); var typeCode = Type.GetTypeCode(objectType.Name.Equals("Nullable`1") ? objectType.GetGenericArguments().First() : objectType); switch (typeCode) { case TypeCode.Decimal: writer.WriteValue(((decimal)value).ToString("f6")); break; case TypeCode.Double: writer.WriteValue(((double)value).ToString("f4")); break; case TypeCode.Single: writer.WriteValue(((float)value).ToString("f2")); break; default: writer.WriteValue(value.ToString()); break; } } } } /// /// 转换成字符串的类型 /// [Flags] public enum NumberConverterShip { /// /// 长整数 /// Int64 = 1, /// /// 无符号长整数 /// UInt64 = 2, /// /// 浮点数 /// Single = 4, /// /// 双精度浮点数 /// Double = 8, /// /// 大数字 /// Decimal =16 } }