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

Serializing .MinValue of value types (C#) in ASP.NET Web API 2 to null

我想在传递给客户端时将 ASP.NET Web API 2 中值类型 (C#) 的 .MinValue 序列化为 null。当客户端发送一个空值时,我想在服务器上返回值类型的 .MinValue。

我正在使用 Json.Net 进行 Json 序列化和反序列化。此外,我需要相同的 URI 参数和表单数据。我需要以下类型:short、int、long、float、double、decimal、DateTime

我尝试过的事情:

Json.Net 中是否有内置的方法来满足我尚未找到的需求?

如何覆盖 Json.Net 中的数字序列化(整数、十进制、..)?

任何其他满足我需求的想法...

您可以使用自定义转换器来执行此操作:

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