c# - 序列化和反序列化的 NullValueHandling 的不同值

标签 c# json .net-core json.net .net-core-3.1

我有一个 .net core 3.1 应用程序。我使用库 json.net (newtonsoft) 来序列化或反序列化 json 。这是 newtonsoft 的应用程序设置:

        public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers(options =>
        {
            options.SuppressAsyncSuffixInActionNames = false;
        }).AddNewtonsoftJson(options =>
        {
            options.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Local;
            options.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
            options.SerializerSettings.Converters.Add(new GuidJsonConverter());
        });
我已经把这一行忽略反序列化的空 json 值:
options.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
但我注意到它也忽略了序列化的空值(当使用 Json 类的方法 Microsoft.AspNetCore.Mvc.Controller 时),但我不想要这种行为。
有没有办法指定 NullValueHandling 的不同值用于序列化和反序列化?

最佳答案

最后我选择了这个解决方案:
我做了一个 BaseController继承自 Microsoft.AspNetCore.Mvc.Controller 的类.我从这个 BaseController 继承了我的每个 Controller 类(class)。
在这个类中,我覆盖了 Microsoft.AspNetCore.Mvc.Controller.Json方法 :

    public class BaseController : Controller
    {
        private readonly JsonSerializerSettings _jsonSerializerSettings;

        public BaseController(IServiceProvider services)
        {
            IOptions<MvcNewtonsoftJsonOptions> newtonsoftOptions = services.GetService<IOptions<MvcNewtonsoftJsonOptions>>();
            _jsonSerializerSettings = newtonsoftOptions.Value.SerializerSettings;
            _jsonSerializerSettings.NullValueHandling = NullValueHandling.Include;
        }

        public override JsonResult Json(object data)
        {
            return Json(data, _jsonSerializerSettings);
        }
感谢 IOptions<MvcNewtonsoftJsonOptions>我能够恢复在启动时初始化的序列化程序设置。

编辑
我注意到值的变化_jsonSerializerSettings.NullValueHandling = NullValueHandling.Include;还要更改 init 序列化程序设置。
所以我做了一个扩展方法来复制序列化器设置的所有数据,目的是更新新设置:
public CustomerAccountController(IServiceProvider services)
{
        IOptions<MvcNewtonsoftJsonOptions> newtonsoftOptions = services.GetService<IOptions<MvcNewtonsoftJsonOptions>>();
        _jsonSerializerSettings = newtonsoftOptions.Value.SerializerSettings.CloneJsonSerializerSettings();
        _jsonSerializerSettings.NullValueHandling = NullValueHandling.Include;
}
public static JsonSerializerSettings CloneJsonSerializerSettings(this JsonSerializerSettings settings)
{
    JsonSerializerSettings cloneSettings = new JsonSerializerSettings();
    cloneSettings.StringEscapeHandling = settings.StringEscapeHandling;
    cloneSettings.FloatParseHandling = settings.FloatParseHandling;
    cloneSettings.FloatFormatHandling = settings.FloatFormatHandling;
    cloneSettings.DateParseHandling = settings.DateParseHandling;
    cloneSettings.DateTimeZoneHandling = settings.DateTimeZoneHandling;
    cloneSettings.DateFormatHandling = settings.DateFormatHandling;
    cloneSettings.Formatting = settings.Formatting;
    cloneSettings.MaxDepth = settings.MaxDepth;
    cloneSettings.DateFormatString = settings.DateFormatString;
    cloneSettings.Context = settings.Context;
    cloneSettings.Error = settings.Error;
    cloneSettings.SerializationBinder = settings.SerializationBinder;
    cloneSettings.Binder = settings.Binder;
    cloneSettings.TraceWriter = settings.TraceWriter;
    cloneSettings.Culture = settings.Culture;
    cloneSettings.ReferenceResolverProvider = settings.ReferenceResolverProvider;
    cloneSettings.EqualityComparer = settings.EqualityComparer;
    cloneSettings.ContractResolver = settings.ContractResolver;
    cloneSettings.ConstructorHandling = settings.ConstructorHandling;
    cloneSettings.TypeNameAssemblyFormatHandling = settings.TypeNameAssemblyFormatHandling;
    cloneSettings.TypeNameAssemblyFormat = settings.TypeNameAssemblyFormat;
    cloneSettings.MetadataPropertyHandling = settings.MetadataPropertyHandling;
    cloneSettings.TypeNameHandling = settings.TypeNameHandling;
    cloneSettings.PreserveReferencesHandling = settings.PreserveReferencesHandling;
    cloneSettings.Converters = settings.Converters;
    cloneSettings.DefaultValueHandling = settings.DefaultValueHandling;
    cloneSettings.NullValueHandling = settings.NullValueHandling;
    cloneSettings.ObjectCreationHandling = settings.ObjectCreationHandling;
    cloneSettings.MissingMemberHandling = settings.MissingMemberHandling;
    cloneSettings.ReferenceLoopHandling = settings.ReferenceLoopHandling;
    cloneSettings.ReferenceResolver = settings.ReferenceResolver;
    cloneSettings.CheckAdditionalContent = settings.CheckAdditionalContent;

    return cloneSettings;
}

关于c# - 序列化和反序列化的 NullValueHandling 的不同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63054916/

相关文章:

c# - 在 winform 的 datagridview 中自定义排序

c# - 实体列表,最大日期,最大 row_id

ios - 我有 json 响应,但它是可选的,任何人都可以告诉我如何解开可选的 json

json - 为 2 个 Controller 配置 2 个不同的 MessageConverter

c# - Blazor 始终以 UTC 格式显示日期

azure - 应用自定义域后,Azure 上的 Web 应用程序加载缓慢

c# - 为什么 Convert.ToDecimal(3.1922) 显示为 31922?

c# - EF 5 + SQL Server CE 4 : How to specify custom location for database file?

javascript - 尝试使用 XMLHttpRequest 获取 JSON 对象失败并导致引用为空

asp.net-core - 如何修改.Aspnetcore.Identity.Application Cookie名称?