Le proprietà JSON ora sono minuscole durante lo scambio da ASP .Net Core 1.0.0-rc2-final a 1.0.0


92

Ho appena cambiato il nostro progetto da ASP .Net Core 1.0.0-rc2-final a 1.0.0. Il nostro sito Web e il nostro cliente hanno smesso di funzionare a causa della capitalizzazione delle proprietà JSON. Ad esempio, questa riga di JavaScript ora non funziona

for (var i = 0; i < collection.Items.length; i++){

perché il controller ora chiama l'array "elementi" invece di "elementi". Non ho apportato modifiche oltre all'installazione dei pacchetti aggiornati e alla modifica del file project.json. Non ho cambiato i file del modello C # che ancora capitalizzano le loro proprietà.

Perché i controller ASP.Net Core hanno iniziato a restituire JSON con proprietà in lettere minuscole? Come posso tornare da loro onorando il caso dei nomi di proprietà dal modello?



2
Per quelli di voi che cercano la risposta per .Net Core 3 è necessario scorrere verso il basso fino alla fine della pagina.
Mike Devenney

Risposte:


159

MVC ora serializza JSON con nomi di case cammello per impostazione predefinita

Usa questo codice per evitare i nomi dei cammelli per impostazione predefinita

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

Fonte: https://github.com/aspnet/Announcements/issues/194


8
netcore2: utilizzo di Newtonsoft.Json.Serialization;
david.barkhuizen

3
Non voglio cambiare tutta la mia serializzazione JSON, solo un caso particolare che deve corrispondere al comportamento di alcuni software di terze parti. Come si forniscono le impostazioni di serializzazione corrette nel secondo parametro della Json()chiamata?
Auspex

82

Nel caso in cui lo avessi trovato da Google e stai cercando una soluzione per Core 3.

Utilizza Core 3 System.Text.Json, che di default non preserva il case. Come accennato con questo problema di GitHub , l'impostazione PropertyNamingPolicydi null risolverà il problema.

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

e se non vuoi cambiare le impostazioni globali, per una sola azione è così:

return Json(obj, new JsonSerializerOptions { PropertyNamingPolicy = null });

8
sei il mio signore e salvatore
Jonty Morris,

1
Questo ha funzionato bene per me su Core 3.1. Non sono riuscito a far funzionare correttamente i miei componenti di kendo e ho scoperto che il json era formattato in camel case. Questo ha risolto il problema.
Waragi

Sono anche il tuo soggetto
João Loureiro


10

Per coloro che hanno eseguito la migrazione a Core 3.1 e hanno un progetto Core MVC, è possibile utilizzare il seguente codice di installazione in Startup.cs:


        public void ConfigureServices(IServiceCollection services)
        {
            ...
            services.AddControllersWithViews().AddJsonOptions(opts => opts.JsonSerializerOptions.PropertyNamingPolicy = null);
            ...
        }

È la stessa di una risposta precedente stackoverflow.com/a/58187836/125981
Mark Schultheiss

@MarkSchultheiss probabilmente hai ragione, poiché la mia risposta è simile a tutte le altre, tuttavia, quando stavo cercando la risposta corretta in base al mio tipo di progetto, che è MVC che utilizza le visualizzazioni, non ho trovato la risposta esatta corrispondente al mio progetto. AddControllersWithViews () aggiunge quel pezzo mancante e ho pensato che sarebbe stato utile per chiunque in futuro. Grazie comunque per il tuo commento!
UY

3

Questo lo risolverà in dotnet core 3 webapi, in modo che non cambi affatto i nomi delle tue proprietà e tu ritorni al tuo cliente esattamente quello che intendevi.

In Startup.cs:

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

È la stessa di una risposta precedente stackoverflow.com/a/58187836/125981
Mark Schultheiss

1

Per qualcuno che utilizza ASP.net WEB API (anziché ASP.NET Core).

Aggiungi questa riga nel tuo WebApiConfig.

//Comment this jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

jsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver();

Aggiungendo questo come risposta qui perché questo viene visualizzato per primo anche nella ricerca di Google per l'API web.


0

Per le versioni Core 2.x, utilizzando questo codice puoi evitare i nomi delle maiuscole per impostazione predefinita. È necessario aggiungere il codice seguente all'interno del metodo ConfigureServices del file Startup.cs.

services.AddMvc()
.AddJsonOptions(o =>
{
    if (o.SerializerSettings.ContractResolver != null)
    {
        var castedResolver = o.SerializerSettings.ContractResolver
        as DefaultContractResolver;

        castedResolver.NamingStrategy = null;
    }
});

0

Per qualcuno che non vuole impostarlo globalmente, è possibile utilizzare ContractResolver anche per restituire come risultato Json:

public IActionResult MyMethod()
{
    var obj = new {myValue = 1};
    return Json(obj, new JsonSerializerSettings {ContractResolver = new DefaultContractResolver()});
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.