¿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?


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



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


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;
        });
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.