¿Cómo establecer la configuración del serializador json en asp.net core 3?

29

ajustes serializador JSON para aplicaciones básicas legado ASP.NET se fijaron mediante la adición AddMvc().AddJsonOptions(), pero no utilizan AddMvc()en asp.net core 3. Entonces, ¿cómo puedo establecer la configuración global de serialización json?

Alex Zaitsev
fuente
Si no usas AddMvc, ¿ qué usas? ¿Está utilizando, por ejemplo, AddControllerso simplemente no está utilizando MVC?
Kirk Larkin
@KirkLarkin uso la forma predeterminada de crear la aplicación asp.net core 3 - app.UseEndpoints(endpoints => { endpoints.MapControllers() })yservices.AddControllers();
Alex Zaitsev
Muy bien, así que supongo que está utilizando AddControllersen ConfigureServices, ¿verdad?
Kirk Larkin
@KirkLarkin, sí, claro
Alex Zaitsev el

Respuestas:

27

AddMvcdevuelve una IMvcBuilderimplementación, que tiene un AddJsonOptionsmétodo de extensión correspondiente . Los métodos de nuevo estilo AddControllers, AddControllersWithViewsy AddRazorPagestambién devuelven una IMvcBuilderaplicación. Encadena con estos de la misma manera que encadenarías con AddMvc:

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

Tenga en cuenta que optionsaquí ya no es para Json.NET, sino para las System.Text.JsonAPI más nuevas . Si aún desea usar Json.NET, vea la respuesta de tymtam

Kirk Larkin
fuente
Agregando "options.JsonSerializerOptions.IgnoreNullValues ​​= true;" no tuvo efecto
zion
1
Para otros que visitan esta página y buscan la conversión de Enum: [JsonConverter (typeof (JsonStringEnumConverter))] public enum SomeEnum
Rafał Praniuk
23

Opción A. Agregar Controladores

Esto todavía es MVC y requiere el paquete nuget Microsoft.AspNetCore.Mvc.NewtonsoftJson, pero usted dijo que lo usa AddControllers.

De Agregar compatibilidad con el formato JSON basado en Newtonsoft.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());
});

Opción B. Configuración predeterminada

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

Propiedad JsonConvert.DefaultSettings

Obtiene o establece una función que crea JsonSerializerSettings predeterminado. La configuración predeterminada se usa automáticamente por los métodos de serialización en JsonConvert, y ToObject () y FromObject (Object) en JToken. Para serializar sin usar ninguna configuración predeterminada, cree un JsonSerializer con Create ().

tymtam
fuente
Hola, esto establece la configuración en el nivel Json.NET, ¿cómo se puede hacer en el nivel ASP.NET?
Alex Zaitsev
Configura los ajustes en el nivel ASP.NET, lo que significa que el ModelBinding predeterminado ahora ocurre usando el serializador NewtonsoftJson.
MrClan
Gracias, la Opción A funcionó para mí. Se actualizó de 2.2 a 3.1 y mi punto final se rompió porque System.Text.Jsonno maneja el polimorfismo o las enumeraciones correctamente. Buena manera fácil de cambiar el serializador predeterminado.
static_void
15

No es necesario agregar Newtonsoft, es un gran problema agregar paquetes de compatibilidad Newtonsoft en el proyecto .Net Core 3.0.

Consulte también https://github.com/aspnet/AspNetCore/issues/13564

Por supuesto, se podría celebrar el nombramiento de propiedad PascalCase, NA en el momento ... Así que nullpara los PropertyNamingPolicymedios PascalCase, lo que obviamente no es muy buena.

// Pascal casing
services.AddControllersWithViews().
        AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
            options.JsonSerializerOptions.PropertyNamingPolicy = null;
        });
OSP
fuente