ASP.NET 核心 MVC - 向服务器发送 JSON 时空字符串为 null
ASP.NET Core MVC - empty string to null when sending JSON to server
当将输入数据作为 FormData
发布到 ASP.NET 核心 MVC 控制器时,默认情况下空字符串值被强制为 null
值。
但是,当将输入数据作为 JSON 发送到控制器时,空字符串值将保持原样。这会导致在验证 string
属性时出现不同的行为。例如,description
字段未绑定到 null
,而是绑定到服务器上的空字符串:
{
value: 1,
description: ""
}
这反过来会使以下模型无效,即使 Description
不是必需的:
public class Item
{
public int Value { get; set; }
[StringLength(50, MinimumLength = 3)]
public string Description { get; set; }
}
这与通过表单提交相同数据时的行为相反。
有没有办法让 JSON 的模型绑定与表单数据的模型绑定的行为相同(空字符串默认强制为 null)?
在查看 ASP.NET Core MVC (v2.1) and source code of Newtonsoft.Json (v11.0.2) 的源代码后,我想出了以下解决方案。
首先,创建自定义 JsonConverter
:
public class EmptyStringToNullJsonConverter : JsonConverter
{
public override bool CanRead => true;
public override bool CanWrite => false;
public override bool CanConvert(Type objectType)
{
return typeof(string) == objectType;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
string value = (string)reader.Value;
return string.IsNullOrWhiteSpace(value) ? null : value.Trim();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException("Unnecessary because CanWrite is false. The type will skip the converter.");
}
}
然后,全局注册自定义转换器:
services
.AddMvc(.....)
.AddJsonOptions(options => options.SerializerSettings.Converters.Add(new EmptyStringToNullJsonConverter()))
或者,通过 JsonConverterAttribute
在每个 属性 基础上使用它。例如:
public class Item
{
public int Value { get; set; }
[StringLength(50, MinimumLength = 3)]
[JsonConverter(typeof(EmptyStringToNullJsonConverter))]
public string Description { get; set; }
}
当将输入数据作为 FormData
发布到 ASP.NET 核心 MVC 控制器时,默认情况下空字符串值被强制为 null
值。
但是,当将输入数据作为 JSON 发送到控制器时,空字符串值将保持原样。这会导致在验证 string
属性时出现不同的行为。例如,description
字段未绑定到 null
,而是绑定到服务器上的空字符串:
{
value: 1,
description: ""
}
这反过来会使以下模型无效,即使 Description
不是必需的:
public class Item
{
public int Value { get; set; }
[StringLength(50, MinimumLength = 3)]
public string Description { get; set; }
}
这与通过表单提交相同数据时的行为相反。
有没有办法让 JSON 的模型绑定与表单数据的模型绑定的行为相同(空字符串默认强制为 null)?
在查看 ASP.NET Core MVC (v2.1) and source code of Newtonsoft.Json (v11.0.2) 的源代码后,我想出了以下解决方案。
首先,创建自定义 JsonConverter
:
public class EmptyStringToNullJsonConverter : JsonConverter
{
public override bool CanRead => true;
public override bool CanWrite => false;
public override bool CanConvert(Type objectType)
{
return typeof(string) == objectType;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
string value = (string)reader.Value;
return string.IsNullOrWhiteSpace(value) ? null : value.Trim();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException("Unnecessary because CanWrite is false. The type will skip the converter.");
}
}
然后,全局注册自定义转换器:
services
.AddMvc(.....)
.AddJsonOptions(options => options.SerializerSettings.Converters.Add(new EmptyStringToNullJsonConverter()))
或者,通过 JsonConverterAttribute
在每个 属性 基础上使用它。例如:
public class Item
{
public int Value { get; set; }
[StringLength(50, MinimumLength = 3)]
[JsonConverter(typeof(EmptyStringToNullJsonConverter))]
public string Description { get; set; }
}