using Newtonsoft.Json; using System; using System.Text; namespace WX.CRM.DAL.Redis { public class DicmalConvert : JsonConverter { public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { //throw new NotImplementedException(); Type t = value.GetType(); if (t == typeof(decimal)) { var val = 0; if (int.TryParse(string.Format("{0:#0.####}", value), out val)) writer.WriteValue(val); else writer.WriteValue(value); } else writer.WriteValue(value); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { //throw new NotImplementedException(); if (reader.TokenType == JsonToken.Null) return null; if (objectType == typeof(decimal)) { return decimal.Parse(string.Format("{0:#0.####}", reader.Value)); } else if (objectType == typeof(float)) { return float.Parse(string.Format("{0:#0.####}", reader.Value)); } return reader.Value; } public override bool CanConvert(Type objectType) { return objectType == typeof(decimal); } } public class JsonRedisValueConverter : ObjectRedisValueConverterBase { public JsonSerializerSettings JsonSettings { get; private set; } public JsonRedisValueConverter() { JsonSettings = new JsonSerializerSettings() { PreserveReferencesHandling = PreserveReferencesHandling.Objects, ReferenceLoopHandling = ReferenceLoopHandling.Ignore }; } protected override object DeserializeCore(Type type, byte[] value) { //JsonSettings.Converters.Add(new DicmalConvert()); return JsonConvert.DeserializeObject(Encoding.UTF8.GetString(value), type, JsonSettings); } protected override byte[] SerializeCore(object value) { //var scriptSerializer = JsonSerializer.Create(JsonSettings); //using (var sw = new StringWriter()) //{ // scriptSerializer.Serialize(sw, value); // return Encoding.UTF8.GetBytes(sw.ToString()); //} //JsonSettings.Converters.Add(new DicmalConvert()); return Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(value, JsonSettings)); } } }