gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:34:20 27 4
gpt4 key购买 nike

我想在传递给客户端时将 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com