ASP.NET Core 3.0 System.Text.Json Deve Kasa Serileştirme


19

ASP.NET Core 3.0 Web API projesinde, Pascal Case özelliklerini Camel Case ve / veya tersi otomatik olarak serileştirmek / serisini kaldırmak için System.Text.Json serileştirme seçeneklerini nasıl belirlersiniz ?

Pascal Case özelliklerine sahip bir model verildiğinde:

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

Ve Personsınıf türüne bir JSON dizisinin serisini kaldırmak için System.Text.Json kullanmak için kod :

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

JsonPropertyName , aşağıdaki gibi her bir özellik ile kullanılmadıkça başarılı bir şekilde serileştirmeyi kaldırmaz :

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

Aşağıdakileri denedim startup.cs, ama yine de ihtiyaç duyma açısından yardımcı olmadı 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;
        });

Yeni System.Text.Json ad alanını kullanarak ASP.NET Core 3.0'da Deve Kutusu serileştirmesini / serileştirmesini nasıl ayarlayabilirsiniz?

Teşekkürler!

Yanıtlar:


25

AddJsonOptions()System.Text.Jsonyalnızca MVC için yapılandırılır . JsonSerializerKendi kodunuzda kullanmak istiyorsanız, konfigürasyonu ona geçmelisiniz.

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

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

System.Text.Json ile tüm proje / uygulama için serileştirme seçeneklerini belirtmenin bir yolu yoktur? Bu System.Text.Json'dan önce önemsizdi
Alexander Staroselsky

Ben öyle düşünmüyorum. Ayarları
geçmeniz


11

İçinde 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); 

Bu newtonsoft.json dosyasını içe aktarmanız gerekmediği anlamına gelir.

Diğer tek seçenek options.JsonSerializerOptions.PropertyNamingPolicyolduğunu JsonNamingPolicy.CamelCase. JsonNamingPolicySnake_case veya PascalCase gibi başka adlandırma politikası seçenekleri yok gibi görünüyor .


Bu benim için çalıştı. FTR, bundan önce hizmetlerimde .AddMvc () yoktu, sadece AddJsonOptions eklenebilir. Tüm sunucu-istemci serileştirme sorunlarım gitti .....
Mark Lazz

10

Kullanabilirsiniz PropertyNameCaseInsensitive. Deserializer'a bir parametre olarak iletmeniz gerekir.

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

hangisi ( dokümanlardan ):

Bir mülk adının serileştirme sırasında büyük / küçük harfe duyarlı olmayan bir karşılaştırma kullanıp kullanmayacağını belirleyen bir değeri alır veya ayarlar. Varsayılan değer false

Bu nedenle, camelCase veya PascalCase belirtmez, ancak büyük / küçük harfe duyarlı olmayan karşılaştırma kullanır. Bunun gereksinimlerinizi karşılayıp karşılamadığından emin değilim.


Not: Bu uygulamayı bir konsol uygulamasında genel olarak ayarlayamadım. Belirtildiği gibi Kahbazi cevabı services.AddMvc().AddJsonOptions ve services.AddControllers().AddJsonOptionssadece MVC ve WebAPI denetleyicileri için Json yapılandıracak (yani değil örneğin bir konsol uygulamasında geniş json ayarları uygulaması, configure olacak). Aşağıda yalnızca bir denetleyici uç noktasından geçen Json için System.Text.Json yapılandırılacaktır:

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

6

CamelCase serileştirmesini istiyorsanız Startup.cs içinde bu kodu kullanın : (örneğin firstName)

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

PascalCase serileştirmesini istiyorsanız Startup.cs dosyasında bu kodu kullanın : (örneğin FirstName)

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

4

Önceki Json serileştirici uygulamasını kullanmanıza izin veren Microsoft.AspNetCore.Mvc.NewtonsoftJson Nuget Package'ı yükleyerek uygulamayı geniş bir alana ayarlayabilirsiniz:

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

Poke Kredileri, cevap burada bulundu: IMvcBuilder AddJsonOptions .Net Core 3.0'da nereye gitti?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.