Genel olarak System.Text.Json.JsonSerializer için varsayılan seçenekleri nasıl ayarlanır?


12

GÜNCELLEME [2019-12-23]: Kısmen vokal topluluğu girdisinden dolayı bu sorun .NET 5.0 yol haritasına eklenmiştir .

GÜNCELLEME [2019-10-10]: Bu davranışın uygulandığını görmekle ilgileniyorsanızSystem.Text.Json.JsonSerializerbaş üstünde yere açık GitHub konuyla tarafından işaret Chris Yungmann ve tartmak.


Bunun yerine:

JsonSerializerOptions options = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
    // etc.
};
JsonSerializer.Deserialize<SomeObject>(someJsonString, options);

Böyle bir şey yapmak istiyorum:

// This property is a pleasant fiction
JsonSerializer.DefaultSettings = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
    // etc.
};

// This uses my options
JsonSerializer.Deserialize<SomeObject>(someJsonString); 

// And somewhere else in the same codebase...
// This also uses my options
JsonSerializer.Deserialize<SomeOtherObject>(someOtherJsonString); 

Umut, JsonSerializerOptionsen sık karşılaştığımız vakaların bir örneğini geçmek ve kuralın değil istisna için geçersiz kılmak zorunda değildir.

Belirtildiği gibi , bu q ve bir bu Json.NET yararlı bir özelliktir. Ben de baktım belgeler için System.Text.Jsonhem de bu GitHub repo NET Çekirdek. Ve bu .

.NET Core 3'te JSON serileştirme varsayılanlarını yönetmek için bir analog yok gibi gözüküyor.


There doesn't seem to be an analog for managing JSON serialization defaults in Core-3- API'nize giren ve API'nizden gelen isteklerden mi bahsediyorsunuz? veya diğer kaynaklara yönelik istek ve yanıtlar?
ps2goat

@ ps2goat Sorunuzu anladığımdan emin değilim. Burada mesele (de) JSON dizelerini serileştirmektir. Çok sayıda kaynaktan gelebilirler.
Trevor Reid

Giriş ve çıkış formatlayıcıları için başlangıçta özel yerler olduğu için soruyordum (örn. Model ciltleme için)
ps2goat

Ah, yakaladım. Bu anlamda durumumuzun "diğer kaynaklar" altına gireceğini düşünüyorum. @ ps2goat
Trevor Reid

Net çekirdek 3.1'e kadar gerçekten üzücü, hala iyi bir yerleşik json serileştirici yoktu.
Joke Huang

Yanıtlar:


4

Hayır, JsonSerializerOptionsortaya çıkarmak değil varsayılan seçenekleri . Belirli bir web çerçevesi kullanıyorsanız, bu yolla serileştirme ayarlarını belirtmenin (de-) bir yolu olabilir. Aksi takdirde, kendi kolaylık yöntemlerinizi oluşturmanızı öneririm.

Ayrıca bu açık konuya bakın .


3

Bir uzantı yöntemi oluşturabilirsiniz. İşte bir örnek

Özel ayarlar oluşturmak zorunda kalmak için ayrı yöntemler kullanıyorum, böylece tüm ayarlar tek bir noktada olacak ve kolayca tekrar kullanılabilir olacak.

public static class DeserializeExtensions
{
    private static JsonSerializerOptions defaultSerializerSettings = new JsonSerializerOptions();

    // set this up how you need to!
    private static JsonSerializerOptions featureXSerializerSettings = new JsonSerializerOptions();


    public static T Deserialize<T>(this string json)
    {       
        return JsonSerializer.Deserialize<T>(json, defaultSerializerSettings);
    }

    public static T DeserializeCustom<T>(this string json, JsonSerializerOptions settings)
    {
        return JsonSerializer.Deserialize<T>(json, settings);
    }

    public static T DeserializeFeatureX<T>(this string json)
    {
        return JsonSerializer.Deserialize<T>(json, featureXSerializerSettings);
    }
}

Daha sonra bunu, ister değişmez ister değişken olsun, bir dizede yöntem olarak adlandırırsınız.

    Car result = @"{""Wheels"": 4, ""Doors"": 2}".DeserializeFeatureX<Car>();

Ah, seninki Json.Net'e bağımlı başka bir cevap, sanırım. Bu soru System.Text.Json.JsonSerializerNET Core-3.0 ek bağımlılıklar olmadan hakkındadır. Teşekkürler.
Trevor Reid

2
Bu soyutlamanın güzelliği. Bu uzantı sınıfının dışında kod değişikliği yok! Sadece dahili olarak güncelledim System.Text.Json.JsonSerializer. Kavram tamamen aynıydı. Örnek bağlantıyı da güncelledim.
ps2goat


2

GitHub kullanıcısı andre-ss6 tarafından aşağıdaki gibi bir geçici çözüm önerilmiştir :

((JsonSerializerOptions)typeof(JsonSerializerOptions)
    .GetField("s_defaultOptions", 
        System.Reflection.BindingFlags.Static |
        System.Reflection.BindingFlags.NonPublic).GetValue(null))
    .PropertyNameCaseInsensitive = true;

-1

(Json.NET kullanmaya geçtiyseniz)

Tüm aramalara açık ve geçiş ayarlarını tercih etmeyi öneririm, ancak DefaultSettings ile varsayılanları ayarlayabilirsiniz .

JsonConvert.DefaultSettings = () => MySuperJsonSerializerSettings;

ve sonra

var json = JsonConvert.SerializeObject(o1);
var o2 = JsonConvert.DeserializeObject(x);

@Tymtam tarafından verilen bu yanıt ve bağlantı Json.Net için geçerlidir. Bu soru System.Text.Json, JSON serileştirmesinin .NET Core 3.0'da kullanıldığı simialr davranışı ile ilgilidir . Yanıt vermek için zaman ayırdığınız için teşekkür ederiz.
Trevor Reid
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.