Свойства JSON теперь в нижнем регистре при замене с ASP .Net Core 1.0.0-rc2-final на 1.0.0

90

Я только что поменял наш проект с ASP .Net Core 1.0.0-rc2-final на 1.0.0. Наш веб-сайт и клиент перестали работать из-за использования заглавных букв в свойствах JSON. Например, эта строка JavaScript теперь не работает

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

потому что теперь контроллер вызывает массив «items» вместо «Items». Я не внес никаких изменений, кроме установки обновленных пакетов и редактирования файла project.json. Я не менял файлы модели C #, которые по-прежнему используют свои свойства.

Почему контроллеры ASP.Net Core начали возвращать JSON со свойствами в нижнем регистре? Как мне вернуться к ним, соблюдая регистр имен свойств из модели?

дамблдад
источник
2
Тем из вас, кто ищет ответ для .Net Core 3, нужно прокрутить страницу вниз до конца.
Майк Девенни

Ответы:

157

MVC теперь сериализует JSON с именами случаев верблюда по умолчанию

Используйте этот код, чтобы по умолчанию избегать имен верблюжьих регистров

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

Источник: https://github.com/aspnet/Announcements/issues/194

Александр Фенцык
источник
8
netcore2: с помощью Newtonsoft.Json.Serialization;
david.barkhuizen
3
Я не хочу менять всю сериализацию JSON, только один конкретный случай, который должен соответствовать поведению некоторого стороннего программного обеспечения. Как обеспечить правильные настройки сериализации во втором параметре Json()вызова?
Auspex
79

Если вы нашли это в Google и ищете решение для Core 3.

Core 3 использует System.Text.Json, что по умолчанию не сохраняет регистр. Как упоминалось в этой проблеме с GitHub , установка PropertyNamingPolicyзначения null устранит проблему.

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

и если вы не хотите изменять глобальные настройки, только для одного действия это так:

return Json(obj, new JsonSerializerOptions { PropertyNamingPolicy = null });
Рон Ребеннак
источник
8
ты мой господин и спаситель
Джонти Моррис
1
У меня это хорошо сработало на Core 3.1. Я не мог заставить мои компоненты кендо работать должным образом и обнаружил, что json отформатирован в формате camel case. Это решило проблему.
Вараги
Я тоже ваша тема
Жоау Лоурейро
19

Вы можете изменить поведение следующим образом:

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

См. Объявление здесь: https://github.com/aspnet/Announcements/issues/194

Джо Одетт
источник
9

Те, кто перешел на Core 3.1 и имеет проект Core MVC, могут использовать следующий код установки в Startup.cs:


        public void ConfigureServices(IServiceCollection services)
        {
            ...
            services.AddControllersWithViews().AddJsonOptions(opts => opts.JsonSerializerOptions.PropertyNamingPolicy = null);
            ...
        }
UY
источник
Это то же самое, что и предыдущий ответ stackoverflow.com/a/58187836/125981
Марк Шультайс
@MarkSchultheiss, вероятно, вы правы, поскольку мой ответ аналогичен всем остальным, однако, когда я искал правильный ответ на основе моего типа проекта, который представляет собой MVC с использованием представлений, я не нашел точного ответа, соответствующего моему проекту. AddControllersWithViews () добавляет недостающий фрагмент, и я подумал, что это будет полезно для всех в будущем. Спасибо за комментарий!
UY
3

Это исправит его в dotnet core 3 webapi, так что он вообще не изменит имена ваших свойств, и вы вернете своему клиенту именно то, что планировали.

В Startup.cs:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers().AddJsonOptions(options => options.JsonSerializerOptions.PropertyNamingPolicy = null);
        services.AddHttpClient();
    }
RouterBox
источник
Это то же самое, что и предыдущий ответ stackoverflow.com/a/58187836/125981
Марк Шультайс
1

Для тех, кто использует ASP.net WEB API (а не ASP.NET Core).

Добавьте эту строку в свой WebApiConfig.

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

jsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver();

Добавляем это в качестве ответа здесь, потому что это также появляется сначала в поиске Google для веб-API.

Абдул Рехман Сайед
источник
0

Для версий Core 2.x, используя этот код, вы можете по умолчанию избегать имен верблюжьих регистров. Вам необходимо добавить следующий код в метод ConfigureServices файла Startup.cs.

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

        castedResolver.NamingStrategy = null;
    }
});
Асири Джаявира
источник