我通常使用ShouldSerialize
来排除没有数据的属性,如数组,但现在,当我只在.NET Core 3
中使用JSON序列化器时,它似乎不会被触发。它是在使用NewtonSoft
时触发的,但我已经从我的项目中删除了它,因为它似乎不再是必需的。
例如:
private ICollection<UserDto> _users;
public ICollection<UserDto> Users
{
get => this._users ?? (this._users = new HashSet<UserDto>());
set => this._users = value;
}
public bool ShouldSerializeUsers()
{
return this._users?.Count > 0;
}
为什么不触发SerializeUsers?
我看到了其他的答案,你可以用途:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddJsonOptions(options => {
options.SerializerSettings.NullValueHandling =
NullValueHandling.Ignore;
});
}
但我想知道是否有其他方法来处理这个问题,因为我没有使用.AddMvc
谢谢。
3条答案
按热度按时间xzlaal3s1#
在ASP.NET Core 3.0中未触发
ShouldSerialize
的原因是,在此版本和后续版本的ASP.NET中,默认情况下使用不同的JSON序列化程序,即System.Text.Json.JsonSerializer
。参见:不幸的是,从.NET Core 3.1开始,这个序列化器不支持
ShouldSerializeXXX()
模式;如果是的话,它应该在JsonSerializer.Write.HandleObject.cs
中的某个地方--但它不是。以下问题跟踪条件序列化的请求:要恢复
ShouldSerialize
功能,您可以恢复使用Newtonsoft,如this answer到 * Where did IMvcBuilder AddJsonOptions go in .Net Core 3.0? * by poke中所示,以及 * 添加Newtonsoft. JSON格式支持 *:1.安装
Microsoft.AspNetCore.Mvc.NewtonsoftJson
。1.然后在
Startup.ConfigureServices
中调用AddNewtonsoftJson()
:bbuxkriu2#
在Net 5中可以使用条件
JsonIgnore
。它没有给予你完整的条件选项,但你至少可以排除null,我想这是最常用的情况:如果想在json中允许可选null,可以使用类似于
Nullable
的自定义Optional<T>
结构,例如:one来自罗斯林。然后,在结果JSON中可能有一个值、null或根本没有字段。z9smfwbn3#
我还有一个ShouldSerialize方法在从REST API返回DTO对象时没有触发。我找到的解决方案是使用以下命令手动将对象转换为JSON字符串:
然后触发ShouldSerialize方法,如果它返回false,则相应的属性将隐藏在生成的JSON字符串中。你只需要手动添加一个HTTP头
Content-Type:application/json
到响应,就可以得到类似的结果。