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?
c#
asp.net-core
asp.net-core-1.0
dumbledad
źródło
źródło
Odpowiedzi:
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
źródło
Json()
wywołania?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ściPropertyNamingPolicy
null 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 });
źródło
Możesz zmienić zachowanie w następujący sposób:
services .AddMvc() .AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());
Zobacz ogłoszenie tutaj: https://github.com/aspnet/Announcements/issues/194
źródło
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); ... }
źródło
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(); }
źródło
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.
źródło
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; } });
źródło