ASP.NET Core 3.0 System.Text.Json Сериализация с верблюжьим корпусом - PullRequest
1 голос
/ 20 октября 2019

Как указать в проекте ASP.NET Core 3.0 Web API System.Text.Json параметры сериализации для сериализации / десериализации свойств Pascal Case в Camel Case и наоборот автоматически?

Учитывая модель со свойствами Pascal Case, такими как:

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?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 20 октября 2019

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);
2 голосов
/ 20 октября 2019

Вы можете использовать PropertyNameCaseInsensitive. Вам необходимо передать его в качестве параметра десериализатору.

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

, который (из документов ):

Получает или задает значение, определяющееиспользуется ли имя свойства без учета регистра при десериализации. Значением по умолчанию является false

Таким образом, оно не указывает camelCase или PascalCase, но будет использовать сравнение без учета регистра. Не уверен, что это соответствует вашим требованиям.


Примечание: Я не смог установить это приложение в широком диапазоне. Нижеприведенное не работает после тестирования:

services.AddControllers()
        .AddJsonOptions(options => {
            options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
         }); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...