ASP.NET Core 3.0 System.Text.Json Serialisasi Kasus Unta

19

Dalam proyek ASP.NET Core 3.0 Web API, bagaimana Anda menentukannya opsi serialisasi System.Text.Json untuk membuat serial / deserialize properti Pascal Case ke Camel Case dan sebaliknya secara otomatis?

Diberikan model dengan properti Pascal Case seperti:

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

Dan kode untuk menggunakan System.Text.Json untuk deserialize string JSON ke tipe Personkelas:

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

Tidak berhasil deserialize kecuali JsonPropertyName digunakan dengan masing-masing properti seperti:

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

Saya mencoba yang berikut startup.cs, tetapi tidak membantu dalam hal masih membutuhkan 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;
        });

Bagaimana Anda bisa mengatur Camel Case serialize / deserialize di ASP.NET Core 3.0 menggunakan namespace System.Text.Json yang baru?

Terima kasih!

Alexander Staroselsky
sumber

Jawaban:

25

AddJsonOptions()akan mengkonfigurasi System.Text.Jsonhanya untuk MVC. Jika Anda ingin menggunakan JsonSerializerkode Anda sendiri, Anda harus meneruskan konfigurasi itu.

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

var json = "{\"firstname\":\"John\",\"lastname\":\"Smith\"}";
var person = JsonSerializer.Parse<Person>(json, options);
Kahbazi
sumber
Tidak ada cara untuk menentukan opsi serialisasi untuk seluruh proyek / aplikasi dengan System.Text.Json? Ini sepele sebelum System.Text.Json
Alexander Staroselsky
Saya kira tidak. Anda harus melewati pengaturan
Kahbazi
11

Dalam 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); 

Ini berarti Anda tidak perlu mengimpor newtonsoft.json.

Satu-satunya pilihan lain options.JsonSerializerOptions.PropertyNamingPolicyadalah JsonNamingPolicy.CamelCase. Tampaknya tidak ada JsonNamingPolicyopsi kebijakan penamaan lainnya, seperti snake_case atau PascalCase.

sutherlandahoy
sumber
Ini berhasil untuk saya. FTR, saya tidak memiliki .AddMvc () di layanan saya sebelum ini, hanya menambahkannya sehingga AddJsonOptions dapat ditambahkan. Semua masalah serialisasi server-klien saya hilang .....
Mark Lazz
10

Anda bisa menggunakannya PropertyNameCaseInsensitive. Anda harus meneruskannya sebagai parameter ke deserializer.

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

yang (dari dokumen ):

Mendapat atau menetapkan nilai yang menentukan apakah nama properti menggunakan perbandingan case-insensitive selama deserialisasi. Nilai standarnya salah

Jadi, itu tidak menentukan camelCase atau PascalCase tetapi akan menggunakan perbandingan case-insensitive. Tidak yakin apakah ini memenuhi persyaratan Anda.


Catatan: Saya tidak dapat mengatur lebar aplikasi ini di aplikasi konsol. Seperti disebutkan dalam jawaban Kahbazi services.AddMvc().AddJsonOptions dan hanya services.AddControllers().AddJsonOptionsakan mengonfigurasi Json untuk MVC dan pengontrol WebApi (yaitu tidak akan mengonfigurasi aplikasi pengaturan Json secara luas di aplikasi konsol, misalnya). Di bawah ini hanya akan mengkonfigurasi System.Text.Json untuk Json melewati titik akhir controller:

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

Jika Anda ingin serialisasi CamelCase gunakan kode ini di Startup.cs : (misalnya firstName)

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

Jika Anda ingin serialisasi PascalCase gunakan kode ini di Startup.cs : (misalnya FirstName)

services.AddControllers()
        .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNamingPolicy= null;
        );
Ramil Aliyev
sumber
4

Anda masih dapat mengatur aplikasi secara luas dengan menginstal Paket Nugget Microsoft.AspNetCore.Mvc.NewtonsoftJson, yang memungkinkan Anda untuk menggunakan implementasi serializer Json sebelumnya:

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

Kredit untuk Poke, jawabannya ditemukan di sini: Di mana IMvcBuilder AddJsonOptions masuk. Net Core 3.0?

Pierre-Paul St-Pierre
sumber