Wymagane właściwości
Począwszy od platformy .NET 7, można oznaczyć pewne właściwości, aby oznaczać, że muszą one znajdować się w ładunku JSON, aby deserializacja zakończyła się pomyślnie. Jeśli co najmniej jedna z tych wymaganych właściwości nie jest obecna, JsonSerializer.Deserialize metody zgłaszają JsonExceptionwartość .
Istnieją trzy sposoby oznaczania właściwości lub pola zgodnie z wymaganiami deserializacji JSON:
- Dodając wymagany modyfikator, który jest nowy w języku C# 11.
- Dodając adnotację do JsonRequiredAttributeelementu , który jest nowy na platformie .NET 7.
- Modyfikując JsonPropertyInfo.IsRequired właściwość modelu kontraktu, która jest nowa na platformie .NET 7.
Z perspektywy serializatora te dwa demarkacje są równoważne, a obie są mapowane na ten sam fragment metadanych, czyli JsonPropertyInfo.IsRequired. W większości przypadków wystarczy użyć wbudowanego słowa kluczowego języka C#. Jednak w następujących przypadkach należy użyć zamiast JsonRequiredAttribute tego:
- Jeśli używasz języka programowania innego niż C# lub starszej wersji języka C#.
- Jeśli chcesz zastosować tylko wymaganie dotyczące deserializacji JSON.
- Jeśli używasz
System.Text.Json
serializacji w trybie generowania źródła. W takim przypadku kod nie zostanie skompilowany, jeśli używaszrequired
modyfikatora, ponieważ generowanie źródła występuje w czasie kompilacji.
Poniższy fragment kodu przedstawia przykład właściwości zmodyfikowanej za pomocą słowa kluczowego required
. Ta właściwość musi znajdować się w ładunku JSON, aby deserializacja powiodła się.
using System.Text.Json;
// The following line throws a JsonException at run time.
Console.WriteLine(JsonSerializer.Deserialize<Person>("""{"Age": 42}"""));
public class Person
{
public required string Name { get; set; }
public int Age { get; set; }
}
Alternatywnie możesz użyć polecenia JsonRequiredAttribute:
using System.Text.Json;
// The following line throws a JsonException at run time.
Console.WriteLine(JsonSerializer.Deserialize<Person>("""{"Age": 42}"""));
public class Person
{
[JsonRequired]
public string Name { get; set; }
public int Age { get; set; }
}
Istnieje również możliwość kontrolowania, czy właściwość jest wymagana za pośrednictwem modelu kontraktu JsonPropertyInfo.IsRequired przy użyciu właściwości :
var options = new JsonSerializerOptions
{
TypeInfoResolver = new DefaultJsonTypeInfoResolver
{
Modifiers =
{
static typeInfo =>
{
if (typeInfo.Kind != JsonTypeInfoKind.Object)
return;
foreach (JsonPropertyInfo propertyInfo in typeInfo.Properties)
{
// Strip IsRequired constraint from every property.
propertyInfo.IsRequired = false;
}
}
}
}
};
// Deserialization now succeeds even though the Name property isn't in the JSON payload.
JsonSerializer.Deserialize<Person>("""{"Age": 42}""", options);
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla