¿Dónde fue IMvcBuilder AddJsonOptions en .Net Core 3.0?

119

Acabo de actualizar mi proyecto de API web ASP de. Net core 2.0a 3.0. Estaba usando

     services.AddMvc()
             .AddJsonOptions(options =>options.SerializerSettings.ContractResolver 
                                       = new DefaultContractResolver());

previamente para garantizar la minúscula del JSON serializado.

Después de la actualización a 3.0, aparece este error:

El error CS1061 'IMvcBuilder' no contiene una definición para 'AddJsonOptions' y no se pudo encontrar ningún método de extensión accesible 'AddJsonOptions' aceptando un primer argumento de tipo 'IMvcBuilder' (¿le falta una directiva using o una referencia de ensamblado?)

De acuerdo con AddJsonOptions para MvcJsonOptions en Asp.Net Core 2.2, el método de extensión AddJsonOptions es / fue proporcionado por el paquete nuget de Microsoft.AspNetCore.Mvc.Formatters.Json . Intenté instalar / reinstalar esto pero todavía no puedo resolver el método. Curiosamente, intellisense solo muestra Microsoft.AspNetCore.Mvc.Formatters. Xml cuando intento agregar la declaración de uso a pesar de que agregué el paquete nuget de Json.

¿Alguna idea de lo que está pasando? La documentación para AddJsonOptions solo llega hasta .Net 2.2, por lo que tal vez el método haya quedado obsoleto en 3.0 a favor de algún otro mecanismo de configuración.

NeilMacMullen
fuente

Respuestas:

203

Como parte de ASP.NET Core 3.0, el equipo dejó de incluir Json.NET de forma predeterminada. Puede leer más sobre eso en general en el anuncio sobre cambios importantes en Microsoft.AspNetCore.App .

En lugar de Json.NET, ASP.NET Core 3.0 y .NET Core 3.0 incluyen una API JSON diferente que se centra un poco más en el rendimiento. Puede obtener más información al respecto en el anuncio sobre "El futuro de JSON en .NET Core 3.0" .

Las nuevas plantillas para ASP.NET Core ya no se incluirán en Json.NET, pero puede reconfigurar fácilmente el proyecto para usarlo en lugar de la nueva biblioteca JSON. Esto es importante tanto para la compatibilidad con proyectos anteriores como porque se supone que la nueva biblioteca no es un reemplazo completo, por lo que no verá el conjunto completo de funciones allí.

Para reconfigurar su proyecto ASP.NET Core 3.0 con Json.NET, deberá agregar una referencia de NuGet Microsoft.AspNetCore.Mvc.NewtonsoftJson, que es el paquete que incluye todos los bits necesarios. Luego, en Startup's ConfigureServices, deberá configurar MVC de esta manera:

services.AddControllers()
    .AddNewtonsoftJson();

Esto configura los controladores MVC y los configura para usar Json.NET en lugar de esa nueva API. En lugar de controladores, también puede usar una sobrecarga MVC diferente (por ejemplo, para controladores con vistas o páginas de Razor). Ese AddNewtonsoftJsonmétodo tiene una sobrecarga que le permite configurar las opciones de Json.NET como estaba acostumbrado AddJsonOptionsen ASP.NET Core 2.x.

services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.ContractResolver = new DefaultContractResolver();
    });
dar un toque
fuente
41
Para aquellos que lo siguen en casa ... al migrar un proyecto, es posible que deba agregar una referencia nuget a "Microsoft.AspNetCore.Mvc.NewtonsoftJson" para obtener la extensión "AddNewtonsoftJson". En el momento de redactar este documento, es necesario que se verifique "incluir versiones preliminares" si está utilizando el administrador de Visual Studio Nuget.
NeilMacMullen
1
Tenga en cuenta que, en general, no recomendaría migrar a ASP.NET Core 3 con aplicaciones reales todavía. Si solo quieres jugar, claro, pero todavía hay algunos bits en movimiento antes del lanzamiento final, por lo que tendrás que tenerlo en cuenta si quieres migrar temprano.
empuje el
1
Esto puede desencadenar "Las operaciones síncronas no están permitidas", consulte stackoverflow.com/questions/47735133/… para obtener más información
verbedr
8
Para mí AddNewtonsoftJsonfalta, incluso después de hacer referencia a esa Microsoft.AspNetCore.Mvc.NewtonsoftJsonreferencia.
Saeed Neamati
2
@avenmore El nuevo serializador usa un conjunto separado de atributos. Puede usar [JsonIgnore]desde el System.Text.Json.Serializationespacio de nombres.
empuje el
21

Esto funcionó para mí, mientras usaba .Net Core 3:

services.AddMvc().AddJsonOptions(o =>
{
    o.JsonSerializerOptions.PropertyNamingPolicy = null;
    o.JsonSerializerOptions.DictionaryKeyPolicy = null;
});
Mohammad Olfatmiri
fuente
o.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
Asumiría que
1
Sí, yo también, pero no es así. Sin embargo, esta respuesta funcionó para mí.
Martin
2
No hay necesidad de o.JsonSerializerOptions.DictionaryKeyPolicy = null;yo.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
Shahar Shokrani
Desearía poder usar esta respuesta, pero mi aplicación se creó con los atributos de Newtonsoft, que el nuevo serializador de MS ignora, lo que significa que tengo que continuar usando el serializador de Newtonsoft con AddNewtonsoftJson. Quizás MS podría agregar una opción para respetar los atributos de Newtonsoft, sin dejar de obtener las ganancias de rendimiento que prometen.
Eric
@eric Sí, tienes razón, pero el rendimiento de Newtonsoft es suficiente para la mayoría de las situaciones.
Mohammad Olfatmiri
0

Esto ayudaría

public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers().AddJsonOptions(options=> {  options.JsonSerializerOptions.PropertyNamingPolicy = null;
                 options.JsonSerializerOptions.DictionaryKeyPolicy = null;

            });

            services.AddDbContext<PaymentDetailContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DevConnection")));
        }
Nirmala
fuente