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

标签 c# json serialization json.net asp.net-web-api2

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

我正在使用 Json.Net 进行 Json 序列化和反序列化。此外,我需要相同的 URI 参数和表单数据。我需要以下类型: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 中覆盖数字序列化(int、decimal、..)?

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

最佳答案

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

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

关于c# - 将 ASP.NET Web API 2 中值类型 (C#) 的 .MinValue 序列化为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31050461/

相关文章:

java - 谷歌地点 API 的 GSON 解析

c# - 进行语言间数据交换的优雅方式

Java:如何序列化生成的 Java 对象的第 3 方库?

c# - Windows Phone 7 - 使用 WebClient 处理 Application_UnhandledException 中的错误

C# Web Api(非 MVC)字典参数

c# - 反序列化自定义数据类型实现 IConvertible 的问题

javascript - 将 Javascript 对象转换为 Javascript 数组

java - 反序列化对象的Arraylist

c# - 在 C# 中使用公钥验证使用 RS256 算法签名的 JWT

c# - ASP.NET MVC下无法使用C#设置和获取cookie