我想将ASP.NET Web API 2中值类型(C#)的.MinValue序列化为传递给客户端时为null.当客户端发送一个null值时,我希望在服务器上获取值类型的.MinValue.
我正在使用Json.Net进行Json序列化和反序列化.此外,我需要相同的URI参数和formdata.我需要以下类型:short,int,long,float,double,decimal,DateTime
我试过的事情:
>一种解决方案是使用可空类型.但是在服务器上我更喜欢使用不可为空的类型,因为业务逻辑层正在处理值类型,而在数据访问层中,如果它们是.MinValue,它们将被转换为dbnull.
>我为DateTime编写了一个JsonConverter(派生自IsoDateTimeconverter),将DateTime.MinValue处理为null,反之亦然.这工作正常,但我不知道如何处理Numbers,因为他们在Json.Net中没有任何JsonConverter实现,或者我找不到它们.
>对于URI参数,我将尝试一些IModelBinder的实现
Json.Net中是否有内置的方式来处理我尚未找到的需求?
如何在Json.Net中覆盖Number-Serialization(int,..)?
任何其他想法,以满足我的需求……
解决方法
您可以使用自定义转换器执行此操作:
public class ValueTypeConverter : JsonConverter { private static List<Type> SupportedTypes = new List<Type> { typeof(short),typeof(int),typeof(long),typeof(float),typeof(double),typeof(decimal),typeof(DateTime) }; private static Dictionary<Type,object> MinValues; static ValueTypeConverter() { MinValues = new Dictionary<Type,object>(); foreach (Type type in SupportedTypes) { MinValues.Add(type,GetMinValue(type)); } } public override object ReadJson( JsonReader reader,Type objectType,object existingValue,JsonSerializer serializer) { object value = reader.Value; value = value ?? MinValues[objectType]; value = Convert.ChangeType(value,objectType); return value; } public override bool CanConvert(Type objectType) { return MinValues.ContainsKey(objectType); } public override void WriteJson( JsonWriter writer,object value,JsonSerializer serializer) { object minValue = MinValues[value.GetType()]; if (object.Equals(value,minValue)) { value = null; } writer.WriteValue(value); } private static object GetMinValue(Type objectType) { FieldInfo minValueFieldInfo = objectType.GetField("MinValue"); return minValueFieldInfo.GetValue(null); } }
用法:
var settings = new JsonSerializerSettings { Converters = new[] { new ValueTypeConverter() } }; string json = JsonConvert.SerializeObject(obj,settings);