Свойства 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. Это решило проблему.
— Вараги

Я тоже ваша тема
— Жоау Лоурейро


9

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


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

Это то же самое, что и предыдущий ответ 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();
    }

Это то же самое, что и предыдущий ответ 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;
    }
});
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.