Anahtar-değer çiftleri seri hale getirilirken ve seri durumdan çıkarılırken PropertyNamingPolicy, PropertyNameCaseInsensitive ve Encoder seçenekleri kullanılır
JsonSerializerPropertyNamingPolicy şimdi bir KeyValuePair<TKey,TValue> örneğin ve Encoder özellik adlarını serileştirirken Key ve Value seçeneklerini yerine getirmektedir. Ayrıca, JsonSerializer örnekleri seri durumdan PropertyNamingPolicy çıkarırken KeyValuePair<TKey,TValue> ve PropertyNameCaseInsensitive seçeneklerine de saygı gösterir.
Açıklama değiştirildi
Serileştirme
.NET Core 3.x sürümlerinde ve System.Text.Json NuGet paketinin 4.6.0-4.7.2 sürümlerinde örneklerin KeyValuePair<TKey,TValue> özellikleri, ve JsonSerializerOptions.EncoderJsonSerializerOptions.PropertyNamingPolicy seçenekleri ne olursa olsun her zaman tam olarak "Anahtar" ve "Değer" olarak serileştirilir. Aşağıdaki kod örneği, belirtilen özellik adlandırma ilkesi böyle dikte etse de ve Value özelliklerinin serileştirmeden sonra nasıl Key deve örneği oluşturmadığını gösterir.
var options = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
KeyValuePair<int, int> kvp = KeyValuePair.Create(1, 1);
Console.WriteLine(JsonSerializer.Serialize(kvp, options));
// Expected: {"key":1,"value":1}
// Actual: {"Key":1,"Value":1}
.NET 5'den başlayarak, PropertyNamingPolicy örnekleri seri hale getirdiğinizde KeyValuePair<TKey,TValue> ve Encoder seçeneklerine saygı gösterilir. Aşağıdaki kod örneği, belirtilen özellik adlandırma ilkesine KeyValue uygun olarak ve özelliklerinin serileştirmeden sonra nasıl büyük/küçük harfe göre sıralanmış olduğunu gösterir.
var options = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
KeyValuePair<int, int> kvp = KeyValuePair.Create(1, 1);
Console.WriteLine(JsonSerializer.Serialize(kvp, options));
// {"key":1,"value":1}
Deserialization
.NET Core 3.x sürümlerinde ve System.Text.Json NuGet paketinin 4.7.x sürümlerinde, JsonException JSON özellik adları tam olarak Key
ve Value
, örneğin büyük harfle başlamadığında bir oluşturulur. Belirtilen özellik adlandırma ilkesi açıkça izin verse bile özel durum oluşturulur.
var options = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
string json = @"{""key"":1,""value"":1}";
// Throws JsonException.
JsonSerializer.Deserialize<KeyValuePair<int, int>>(json, options);
.NET 5'den başlayarak ve PropertyNamingPolicyPropertyNameCaseInsensitive seçenekleri kullanılarak JsonSerializerseri durumdan çıkarılırken kullanılır. Örneğin, aşağıdaki kod parçacığı, belirtilen özellik adlandırma ilkesi izin vermediğinden küçük harfli Key ve Value özellik adlarının seri durumdan başarıyla çıkarılmış olduğunu gösterir.
var options = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
string json = @"{""key"":1,""value"":1}";
KeyValuePair<int, int> kvp = JsonSerializer.Deserialize<KeyValuePair<int, int>>(json);
Console.WriteLine(kvp.Key); // 1
Console.WriteLine(kvp.Value); // 1
Önceki sürümlerle seri hale getirilmiş yükleri barındırmak için, "Anahtar" ve "Değer", seri durumdan çıkarılırken eşleşecek şekilde özel durumlu olarak kullanılır. ve Value özellik adları, aşağıdaki kod örneğindeki seçeneğe göre PropertyNamingPolicy büyük/küçük harf kullanılmasa Key da, başarıyla seri durumdan çıkarılır.
var options = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
string json = @"{""Key"":1,""Value"":1}";
KeyValuePair<int, int> kvp = JsonSerializer.Deserialize<KeyValuePair<int, int>>(json);
Console.WriteLine(kvp.Key); // 1
Console.WriteLine(kvp.Value); // 1
Sürüm kullanıma sunulmuştur
5.0
Değişiklik nedeni
Önemli müşteri geri bildirimleri, kabul PropertyNamingPolicy edilmesi gerektiğini belirtti. Tamlık PropertyNameCaseInsensitive için ve Encoder seçenekleri de kabul edilir, böylece KeyValuePair<TKey,TValue> örnekler diğer tüm düz eski CLR nesnesi (POCO) ile aynı şekilde ele alınır.
Önerilen eylem
Bu değişiklik sizin için kesintiye neden oluyorsa, istenen semantiği uygulayan özel bir dönüştürücü kullanabilirsiniz.