json 在.NET Core 3中未触发ShouldSerialize方法

ogq8wdun  于 2023-05-23  发布在  .NET
关注(0)|答案(3)|浏览(179)

我通常使用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
谢谢。

xzlaal3s

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()

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers()
        .AddNewtonsoftJson();
}
bbuxkriu

bbuxkriu2#

在Net 5中可以使用条件JsonIgnore。它没有给予你完整的条件选项,但你至少可以排除null,我想这是最常用的情况:

[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public string? MyProperty { get; set; }

如果想在json中允许可选null,可以使用类似于Nullable的自定义Optional<T>结构,例如:one来自罗斯林。然后,在结果JSON中可能有一个值、null或根本没有字段。

z9smfwbn

z9smfwbn3#

我还有一个ShouldSerialize方法在从REST API返回DTO对象时没有触发。我找到的解决方案是使用以下命令手动将对象转换为JSON字符串:

string json = JsonConvert.SerializeObject(
    objectToSerialize,
    Formatting.Indented,
    new JsonSerializerSettings { ContractResolver = new DefaultContractResolver() }
);

然后触发ShouldSerialize方法,如果它返回false,则相应的属性将隐藏在生成的JSON字符串中。你只需要手动添加一个HTTP头Content-Type:application/json到响应,就可以得到类似的结果。

相关问题