将 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
我尝试过的事情:
- 一种解决方案是使用可空类型。但在服务器上,我更喜欢使用不可空类型,因为业务逻辑层使用值类型,而在数据访问层中,如果它们是 .MinValue.
,则它们将转换为 DBNull
- 我为 DateTime 编写了一个 Json 转换器(派生自 IsoDateTimeconverter)来将 DateTime.MinValue 处理为 null,反之亦然。这工作正常,但我不确定如何处理 Numbers,因为它们在 Json.Net 中没有任何 JsonConverter 实现,或者我找不到它们。
- 对于 URI 参数,我将尝试一些 IModelBinder 的实现
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);
我想在传递给客户端时将 ASP.NET Web API 2 中值类型 (C#) 的 .MinValue 序列化为 null。当客户端发送一个空值时,我想在服务器上返回值类型的 .MinValue。
我正在使用 Json.Net 进行 Json 序列化和反序列化。此外,我需要相同的 URI 参数和表单数据。我需要以下类型:short、int、long、float、double、decimal、DateTime
我尝试过的事情:
- 一种解决方案是使用可空类型。但在服务器上,我更喜欢使用不可空类型,因为业务逻辑层使用值类型,而在数据访问层中,如果它们是 .MinValue. ,则它们将转换为 DBNull
- 我为 DateTime 编写了一个 Json 转换器(派生自 IsoDateTimeconverter)来将 DateTime.MinValue 处理为 null,反之亦然。这工作正常,但我不确定如何处理 Numbers,因为它们在 Json.Net 中没有任何 JsonConverter 实现,或者我找不到它们。
- 对于 URI 参数,我将尝试一些 IModelBinder 的实现
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);