Možnosti PropertyNamingPolicy, PropertyNameCaseInsensitive a Encoder jsou dodrženy při serializaci a deserializaci párů klíč-hodnota
JsonSerializer nyní respektuje PropertyNamingPolicy a Encoder možnosti při serializaci Key názvů a Value vlastností KeyValuePair<TKey,TValue> instance. Kromě toho JsonSerializer respektuje PropertyNamingPolicy a PropertyNameCaseInsensitive možnosti při deserializaci KeyValuePair<TKey,TValue> instancí.
Změna popisu
Serializace
Ve verzích .NET Core 3.x a ve verzích NuGet System.Text.Json verze 4.6.0-4.7.2 jsou vlastnosti KeyValuePair<TKey,TValue> instancí vždy serializovány jako klíč a hodnota přesně bez ohledu na všechny JsonSerializerOptions.PropertyNamingPolicy možnosti a JsonSerializerOptions.Encoder možnosti. Následující příklad kódu ukazuje, jak Key a Value vlastnosti nejsou camel-cased po serializaci, i když zadané zásady pojmenování property-pojmenování tak.
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}
Počínaje rozhraním .NET 5 PropertyNamingPolicy jsou při serializaci KeyValuePair<TKey,TValue> instancí dodrženy možnosti a Encoder možnosti. Následující příklad kódu ukazuje, jak Key jsou a Value vlastnosti camel-cased po serializaci v souladu se zadanou zásadou pojmenování property-pojmenování.
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}
Rekonstrukci
Ve verzích .NET Core 3.x a ve verzích 4.7.x balíčku NuGet System.Text.Json se vyvolá, JsonException když názvy vlastností JSON nejsou přesné Key
a Value
například pokud nezačínají velkým písmenem. Výjimka se vyvolá i v případě, že je zadaná zásada pojmenování vlastností výslovně povolena.
var options = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
string json = @"{""key"":1,""value"":1}";
// Throws JsonException.
JsonSerializer.Deserialize<KeyValuePair<int, int>>(json, options);
Počínaje rozhraním .NET 5 PropertyNamingPolicy se při PropertyNameCaseInsensitive deserializaci pomocí JsonSerializer. Například následující fragment kódu ukazuje úspěšnou deserializaci názvů lowercased Key a Value vlastností, protože zadané zásady pojmenování vlastností ji umožňují.
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
Aby bylo možné přizpůsobit datové části serializované s předchozími verzemi, "Klíč" a "Hodnota" se při deserializaci shodují. I když Key názvy a Value názvy vlastností nejsou velbloudě na PropertyNamingPolicy základě možnosti v následujícím příkladu kódu, deserializují úspěšně.
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
Zavedená verze
5,0
Důvod změny
Podstatná zpětná vazba od zákazníků značila, že PropertyNamingPolicy by měla být dodržena. Pro úplnost PropertyNameCaseInsensitive Encoder jsou dodrženy i možnosti, aby KeyValuePair<TKey,TValue> instance byly považovány za stejné jako všechny ostatní objekty CLR (POCO).
Doporučená akce
Pokud je tato změna pro vás rušivá, můžete použít vlastní převaděč , který implementuje požadovanou sémantiku.