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?

dumbledad
źródło
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

Oleksandr Fentsyk
źródło
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 });
Ron Rebennack
źródło
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);
            ...
        }
UY
źródło
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();
    }
RouterBox
źródło
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.

Abdul Rehman Sayed
źródło
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;
    }
});
Asiri Jayaweera
źródło