ASP.NET Core 3.0 System.Text.Json Camel Case Serialization


19

У проекті API 3.0 Web ASP.NET ядра, як ви визначаєте System.Text.Json параметри сериализации для сериализации / десеріалізациі властивостей Паскаля випадку до ГорбатийРегістр і навпаки автоматично?

Дано модель із властивостями корпусу Паскаля, такі як:

public class Person
{
    public string Firstname { get; set; }
    public string Lastname { get; set; }
}

І використовувати код System.Text.Json для деріаріалізації рядка JSON до типу Personкласу:

var json = "{\"firstname\":\"John\",\"lastname\":\"Smith\"}";
var person = JsonSerializer.Deserialize<Person>(json);

Не успішно дезаріалізується, якщо JsonPropertyName не використовується з кожним властивістю, наприклад:

public class Person
{
    [JsonPropertyName("firstname")
    public string Firstname { get; set; }
    [JsonPropertyName("lastname")
    public string Lastname { get; set; }
}

Я спробував наступне в startup.cs, але це не допомогло з точки зору необхідності JsonPropertyName:

services.AddMvc().AddJsonOptions(options =>
{
    options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase;
    options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
});

// also the following given it's a Web API project

services.AddControllers().AddJsonOptions(options => {
    options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase;
    options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
        });

Як можна встановити Camel Case серіалізувати / десеріалізувати в ASP.NET Core 3.0 за допомогою нового простору імен System.Text.Json?

Дякую!

Відповіді:


25

AddJsonOptions()буде конфігуруватися System.Text.Jsonлише для MVC. Якщо ви хочете використовувати JsonSerializerу власному коді, вам слід передати його конфігурацію.

var options = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
};

var json = "{\"firstname\":\"John\",\"lastname\":\"Smith\"}";
var person = JsonSerializer.Parse<Person>(json, options);

Немає можливості вказати параметри серіалізації для всього проекту / програми за допомогою System.Text.Json? Це було тривіально перед System.Text.Json
Олександром Старосельським

Я не думаю, що так. Вам потрібно пройти налаштування
Кабазі


11

В startup.cs:

// keeps the casing to that of the model when serializing to json (default is converting to camelCase)
services.AddMvc()
    .AddJsonOptions(options => options.JsonSerializerOptions.PropertyNamingPolicy = null); 

Це означає, що вам не потрібно імпортувати newtonsoft.json.

Єдиний інший варіант - options.JsonSerializerOptions.PropertyNamingPolicyце JsonNamingPolicy.CamelCase. Здається, немає інших JsonNamingPolicyваріантів політики іменування, таких як snake_case або PascalCase.


Це працювало для мене. FTR, я не мав .AddMvc () у своїх службах до цього, лише додаючи його, щоб AddJsonOptions можна було додати. Усі мої проблеми з серіалізацією сервер-клієнт пішли .....
Mark Lazz

10

Можна використовувати PropertyNameCaseInsensitive. Потрібно передати його як параметр десеріалізатору.

var json = "{\"firstname\":\"John\",\"lastname\":\"Smith\"}";
var options = new JsonSerializerOptions() { PropertyNameCaseInsensitive = true };
var person = JsonSerializer.Deserialize<Person>(json, options);

який (з документів ):

Отримує або встановлює значення, яке визначає, чи використовує ім'я властивості порівняння, нечутливе до регістру, під час десеріалізації. Значення за замовчуванням - помилкове

Таким чином, він не вказує camelCase або PascalCase, але він буде використовувати порівняння, що не враховує регістри. Не впевнений, чи відповідає це вашим вимогам.


Примітка: мені не вдалося встановити цю програму в консольному додатку. Як зазначено в відповіді Kahbazi в services.AddMvc().AddJsonOptions і services.AddControllers().AddJsonOptionsналаштує JSon тільки MVC і WebAPI контролерів (тобто не буде налаштувати JSon Установки програми широкі в консольному додатку, наприклад). Нижче буде налаштовано лише System.Text.Json для Json, що пройшов через кінцеву точку контролера:

services.AddControllers()
        .AddJsonOptions(options => {
            options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
         }); 

6

Якщо ви хочете серіалізацію CamelCase, використовуйте цей код у Startup.cs : (наприклад firstName)

services.AddControllers()
        .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
        });

Якщо ви хочете серіалізацію PascalCase, використовуйте цей код у Startup.cs : (наприклад, FirstName)

services.AddControllers()
        .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNamingPolicy= null;
        );

4

Ви все ще можете встановити його додаток широко, встановивши Microsoft.AspNetCore.Mvc.NewtonsoftJson Nuget Package, який дозволяє використовувати попередню реалізацію серіалізатора Json:

services.AddControllers()
        .AddNewtonsoftJson(options =>
        {
            options.SerializerSettings.ContractResolver = new DefaultContractResolver();
        });

Кредити Poke, відповідь знайдено тут: Куди зайшов IMvcBuilder AddJsonOptions .Net Core 3.0?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.