加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

将ASP.NET Web API 2中值类型(C#)的.MinValue序列化为null

发布时间:2020-12-16 09:55:22 所属栏目:asp.Net 来源:网络整理
导读:我想将ASP.NET Web API 2中值类型(C#)的.MinValue序列化为传递给客户端时为null.当客户端发送一个null值时,我希望在服务器上获取值类型的.MinValue. 我正在使用Json.Net进行Json序列化和反序列化.此外,我需要相同的URI参数和formdata.我需要以下类型:short,
我想将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);

示例:https://dotnetfiddle.net/WPhJr5

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读