Właściwości JSON są teraz małe przy zamianie z ASP .Net Core 1.0.0-rc2-final na 1.0.0


90

Właśnie zamieniłem nasz projekt z ASP .Net Core 1.0.0-rc2-final na 1.0.0. Nasza strona internetowa i klient przestali działać z powodu kapitalizacji właściwości JSON. Na przykład ta linia JavaScript teraz zawodzi

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

ponieważ kontroler wywołuje teraz tablicę „items” zamiast „Items”. Nie wprowadziłem żadnych zmian poza zainstalowaniem zaktualizowanych pakietów i edycją pliku project.json. Nie zmieniłem plików modelu C #, które nadal wykorzystują wielkie litery ich właściwości.

Dlaczego kontrolery ASP.Net Core zaczęły zwracać kod JSON z właściwościami o małej wielkości liter? Jak do nich wrócić, honorując przypadek nazw nieruchomości z modelu?



2
Ci, którzy szukają odpowiedzi na temat .Net Core 3, powinni przewinąć do samego dołu strony.
Mike Devenney

Odpowiedzi:


157

MVC teraz domyślnie serializuje JSON z nazwami wielbłądów

Użyj tego kodu, aby domyślnie unikać nazw wielbłądów

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

Źródło: https://github.com/aspnet/Announcements/issues/194


8
netcore2: using Newtonsoft.Json.Serialization;
david.barkhuizen

3
Nie chcę zmieniać całej mojej serializacji JSON, tylko jeden konkretny przypadek, który musi pasować do zachowania niektórych programów innych firm. Jak można zapewnić prawidłowe ustawienia serializacji w drugim parametrze Json()wywołania?
Auspex

79

Jeśli znalazłeś to od Google i szukasz rozwiązania dla Core 3.

Core 3 używa System.Text.Json, co domyślnie nie zachowuje przypadku. Jak wspomniano w przypadku tego problemu z GitHubem , ustawienie wartości PropertyNamingPolicynull rozwiąże problem.

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

a jeśli nie chcesz zmieniać ustawień globalnych, tylko dla jednej akcji jest tak:

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

8
jesteś moim panem i zbawicielem
Jonty Morris

1
To działało dobrze dla mnie na Core 3.1. Nie mogłem sprawić, by moje komponenty kendo działały poprawnie i znalazłem plik json w formacie wielbłąda. To rozwiązało problem.
Waragi

Jestem również twoim tematem
João Loureiro


9

Dla tych, którzy przeprowadzili migrację do Core 3.1 i mają projekt Core MVC, mogą użyć następującego kodu instalacyjnego w Startup.cs:


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

To jest to samo, co wcześniejsza odpowiedź stackoverflow.com/a/58187836/125981
Mark Schultheiss

@MarkSchultheiss prawdopodobnie masz rację, ponieważ moja odpowiedź jest podobna do wszystkich innych, jednak gdy szukałem właściwej odpowiedzi w oparciu o typ mojego projektu, czyli MVC wykorzystujący widoki, nie znalazłem dokładnej odpowiedzi pasującej do mojego projektu. AddControllersWithViews () dodaje te brakujące elementy i pomyślałem, że będzie to przydatne dla każdego w przyszłości. Dziękuję za komentarz!
UY

3

Spowoduje to naprawienie tego w sieci webapi dotnet core 3, tak aby w ogóle nie zmieniało nazw właściwości i wrócisz do klienta dokładnie to, co zamierzałeś.

W Startup.cs:

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

To jest to samo, co wcześniejsza odpowiedź stackoverflow.com/a/58187836/125981
Mark Schultheiss

1

Dla kogoś, kto używa ASP.net WEB API (zamiast ASP.NET Core).

Dodaj tę linię do swojego WebApiConfig.

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

jsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver();

Dodanie tego jako odpowiedzi tutaj, ponieważ pojawia się również jako pierwsze w wyszukiwarce Google dla interfejsu API sieci Web.


0

W przypadku wersji Core 2.x przy użyciu tego kodu można domyślnie unikać nazw wielbłądów. Musisz dodać następujący kod w metodzie ConfigureServices pliku Startup.cs.

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

        castedResolver.NamingStrategy = null;
    }
});
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.