TG.WXCRM.V4/DAL/Redis/JsonRedisValueConverter.cs

78 lines
2.6 KiB
C#

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