如何在ASP.NET Core 3中设置JSON序列化程序设置?


29

旧版asp.net核心应用程序的json序列化程序设置是通过添加设置的AddMvc().AddJsonOptions(),但我没有AddMvc()在中使用asp.net core 3。那么如何设置全局json序列化设置呢?


如果你不使用AddMvc,有什么你何用?您正在使用eg AddControllers还是根本不使用MVC?
柯克·拉金

@KirkLarkin我使用默认的方式来构建asp.net core 3应用程序- app.UseEndpoints(endpoints => { endpoints.MapControllers() })services.AddControllers();
Alex Zaitsev,

好吧,所以我想您正在使用AddControllersConfigureServices,对吗?
柯克·拉金

@KirkLarkin,是的,对
Alex Zaitsev

Answers:


27

AddMvc返回一个IMvcBuilder实现,该实现具有相应的AddJsonOptions扩展方法。新型方法 AddControllersAddControllersWithViewsAddRazorPages还返回一个IMvcBuilder实现。以与您链接的相同方式与这些链接AddMvc

services.AddControllers()
    .AddJsonOptions(options =>
    {
        // ...
    });

请注意,options这里不再适用于Json.NET,而是适用于较新的System.Text.JsonAPI。如果您仍然想使用Json.NET,请参阅tymtam的答案



添加“ options.JsonSerializerOptions.IgnoreNullValues = true;” 没有任何效果
锡安

1
对另一些人谁打这个网页寻找枚举转换:[JsonConverter(typeof运算(JsonStringEnumConverter))]公共枚举SomeEnum
拉法尔Praniuk

23

选项A. AddControllers

这仍然是MVC,并且需要nuget包Microsoft.AspNetCore.Mvc.NewtonsoftJson,但是您说您使用AddControllers

添加基于Newtonsoft.Json的JSON格式支持

services.AddControllers().AddNewtonsoftJson(options =>
{
    // Use the default property (Pascal) casing
    options.SerializerSettings.ContractResolver = new DefaultContractResolver();

    // Configure a custom converter
    options.SerializerOptions.Converters.Add(new MyCustomJsonConverter());
});

选项B.默认设置

JsonConvert.DefaultSettings = () => new JsonSerializerSettings (...)

JsonConvert.DefaultSettings属性

获取或设置一个函数,该函数创建默认的JsonSerializerSettings。默认设置由JsonConvert上的序列化方法自动使用,而JToken上的ToObject()和FromObject(Object)自动使用。要在不使用任何默认设置的情况下进行序列化,请使用Create()创建一个JsonSerializer。


嗨,这是在Json.NET级别设置的设置,如何在ASP.NET级别完成设置?
Alex Zaitsev

它在ASP.NET级别上配置设置,这意味着默认的ModelBinding现在使用NewtonsoftJson序列化器进行。
MrClan

谢谢您,选项A为我工作。从2.2升级到3.1,我的端点坏了,因为System.Text.Json不能正确处理多态或枚举。更改默认序列化器的简便方法。
static_void

15

不需要添加Newtonsoft,在.Net Core 3.0项目上添加Newtonsoft兼容性软件包是一个很大的问题。

另请参见https://github.com/aspnet/AspNetCore/issues/13564

当然,现在有人会庆祝财产命名PascalCase,不适用...所以nullPropertyNamingPolicyPascalCase而言,这显然不是很好。

// Pascal casing
services.AddControllersWithViews().
        AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
            options.JsonSerializerOptions.PropertyNamingPolicy = null;
        });
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.