Wymagane właściwości
Aby oznaczyć pewne właściwości, można oznaczyć, że muszą one znajdować się w ładunku JSON, aby deserializacja zakończyła się pomyślnie. Podobnie można ustawić opcję, aby określić, że wszystkie parametry konstruktora inne niż opcjonalne znajdują się w ładunku JSON. 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:
required
Dodając modyfikator.- Dodając adnotację do JsonRequiredAttributeelementu .
- Modyfikując JsonPropertyInfo.IsRequired właściwość modelu kontraktu.
Aby określić, że do deserializacji JSON są wymagane wszystkie parametry konstruktora innego niż opcjonalny, ustaw JsonSerializerOptions.RespectRequiredConstructorParameters opcję (lub dla generowania źródła, RespectRequiredConstructorParameters właściwość) na true
wartość . Aby uzyskać więcej informacji, zobacz sekcję Parametry konstruktora nie opcjonalnego.
Z perspektywy serializatora modyfikator języka C# required
i [JsonRequired]
atrybut są równoważne, a oba elementy są mapowane na ten sam element 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ę.
public static void RunIt()
{
// 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:
public static void RunIt()
{
// 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 :
public static void RunIt()
{
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 succeeds even though
// the Name property isn't in the JSON payload.
JsonSerializer.Deserialize<Person>("""{"Age": 42}""", options);
}
public class Person
{
public required string Name { get; set; }
public int Age { get; set; }
}
Parametry konstruktora innego niż opcjonalny
Przed platformą .NET 9 deserializacja oparta na konstruktorach potraktowała wszystkie parametry konstruktora jako opcjonalne, jak pokazano w poniższym przykładzie:
var result = JsonSerializer.Deserialize<Person>("{}");
Console.WriteLine(result); // Person { Name = , Age = 0 }
record Person(string Name, int Age);
Począwszy od platformy .NET 9, można ustawić flagę RespectRequiredConstructorParameters tak, aby traktować parametry konstruktora inne niż opcjonalne zgodnie z potrzebami.
public static void RunIt()
{
JsonSerializerOptions options = new()
{
RespectRequiredConstructorParameters = true
};
string json = """{"Age": 42}""";
// The following line throws a JsonException at run time.
JsonSerializer.Deserialize<Person>(json, options);
}
record Person(string Name, int? Age = null);
Przełączniki funkcji
Ustawienie można włączyć RespectRequiredConstructorParameters
globalnie przy użyciu przełącznika System.Text.Json.Serialization.RespectRequiredConstructorParametersDefault
funkcji. Dodaj następujący element MSBuild do pliku projektu (na przykład plik csproj ):
<ItemGroup>
<RuntimeHostConfigurationOption Include="System.Text.Json.Serialization.RespectRequiredConstructorParametersDefault" Value="true" />
</ItemGroup>
Interfejs API został zaimplementowany jako flaga RespectRequiredConstructorParametersDefault
zgody na platformie .NET 9, aby uniknąć przerywania istniejących aplikacji. Jeśli piszesz nową aplikację, zdecydowanie zaleca się włączenie tej flagi w kodzie.