Opsi PropertyNamingPolicy, PropertyNameCaseInsensitive, dan Encoder dihormati saat menserialisasikan dan mendeserialisasi pasangan kunci-nilai
JsonSerializersekarang menghormati opsi dan Encoder saat menserialisasikan KeyPropertyNamingPolicy nama properti dan Value instansKeyValuePair<TKey,TValue>. Selain itu, JsonSerializer menghormati PropertyNamingPolicy opsi dan PropertyNameCaseInsensitive saat mendeserialisasi KeyValuePair<TKey,TValue> instans.
Deskripsi perubahan
Serialisasi
Dalam versi .NET Core 3.x dan dalam versi 4.6.0-4.7.2 dari paket System.Text.Json NuGet, properti KeyValuePair<TKey,TValue> instans selalu diserialisasikan sebagai "Kunci" dan "Nilai" persis, terlepas dari opsi dan JsonSerializerOptions.Encoder apa punJsonSerializerOptions.PropertyNamingPolicy. Contoh kode berikut menunjukkan bagaimana Key properti dan Value tidak di-camel-cased setelah serialisasi, meskipun kebijakan penamaan properti yang ditentukan menentukan demikian.
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}
Mulai dari .NET 5, PropertyNamingPolicy opsi dan Encoder dihormati saat menserialisasikan KeyValuePair<TKey,TValue> instans. Contoh kode berikut menunjukkan bagaimana Key properti dan Value di-camel-cased setelah serialisasi, sesuai dengan kebijakan penamaan properti yang ditentukan.
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}
Deserialisasi
Dalam versi .NET Core 3.x dan dalam versi 4.7.x dari paket NuGet System.Text.Json, JsonException dilemparkan ketika nama properti JSON tidak tepat Key
dan Value
, misalnya, jika tidak dimulai dengan huruf besar. Pengecualian dilemparkan bahkan jika kebijakan penamaan properti tertentu secara tegas mengizinkannya.
var options = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
string json = @"{""key"":1,""value"":1}";
// Throws JsonException.
JsonSerializer.Deserialize<KeyValuePair<int, int>>(json, options);
Mulai dari .NET 5, PropertyNamingPolicy opsi dan PropertyNameCaseInsensitive dihormati saat deserialisasi menggunakan JsonSerializer. Misalnya, cuplikan kode berikut menunjukkan deserialisasi yang berhasil dari nama huruf kecil Key dan Value properti karena kebijakan penamaan properti yang ditentukan mengizinkannya.
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
Untuk mengakomodasi payload yang diserialisasikan dengan versi sebelumnya, "Kunci" dan "Nilai" di-caseding khusus untuk dicocokkan saat deserialisasi. Meskipun Key nama properti dan Value tidak di-camel-cased sesuai dengan PropertyNamingPolicy opsi dalam contoh kode berikut, nama properti dan berhasil dideserialisasi.
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
Versi yang diperkenalkan
5.0
Alasan untuk berubah
Umpan balik pelanggan yang substansial menunjukkan bahwa PropertyNamingPolicy harus dihormati. Untuk kelengkapan, PropertyNameCaseInsensitive opsi dan Encoder juga dihormati, sehingga KeyValuePair<TKey,TValue> instans diperlakukan sama dengan objek CLR lama biasa (POCO) lainnya.
Tindakan yang direkomendasikan
Jika perubahan ini mengganggu Anda, Anda dapat menggunakan pengonversi kustom yang mengimplementasikan semantik yang diinginkan.