.netcore webapi json返回值序列化null替換爲空字符串
場景:數據庫中部分表字段允許空值,則代碼中實體類對應的字段類型爲可空類型Nullable<>,如int?,DateTime?,null值字段序列化返回的值都爲null,前端對應字段賦值需要做null值判斷,隨想到全局把null替換爲""
網上找的方案都是重寫了DefaultContractResolver,但是該方法只能解決string類型null→""的問題,對其他可空類型無效。
研究了下git 上Newtonsoft.Json和.netcore MVC的源碼
最終使用自定義JsonOutputFormatter方式實現:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
//過濾器
services.AddMvc(config =>
{
var settings = new JsonSerializerSettings();
settings.ContractResolver = new DefaultContractResolver();
//統一設置JsonResult中的日期格式
settings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
config.OutputFormatters.Insert(0, new MyJsonOutputFormatter(settings));
});
//services.AddMvc().AddJsonOptions(options =>
//{
// //options.SerializerSettings.ContractResolver = new SubstituteNullWithEmptyStringContractResolver();
// ////統一設置JsonResult中的日期格式
// //options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
//});
services.AddMvcCore().AddApiExplorer();
}
public class MyJsonOutputFormatter : JsonOutputFormatter
{
public MyJsonOutputFormatter(JsonSerializerSettings serializerSettings) : base(serializerSettings, ArrayPool<char>.Shared)
{
}
public new JsonSerializerSettings SerializerSettings => base.SerializerSettings;
protected override JsonWriter CreateJsonWriter(TextWriter writer)
{
if (writer == null)
{
throw new ArgumentNullException(nameof(writer));
}
var jsonWriter = new NullJsonWriter(writer)
{
ArrayPool = new JsonArrayPool<char>(ArrayPool<char>.Shared),
CloseOutput = false,
AutoCompleteOnClose = false
};
return jsonWriter;
}
}
public class NullJsonWriter : JsonTextWriter
{
public NullJsonWriter(TextWriter textWriter):base(textWriter)
{
}
public override void WriteNull()
{
this.WriteValue(String.Empty);
}
}