Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Můžete označit určité vlastnosti, které značí, že musí být k dispozici v datové části JSON, aby bylo možné provést deserializaci. Podobně můžete nastavit možnost, která určuje, že všechny parametry konstruktoru, které nejsou volitelné, se nacházejí v datové části JSON. Pokud některá z těchto požadovaných vlastností není přítomna, JsonSerializer.Deserialize metody vyvolají JsonException.
Existují tři způsoby, jak označit vlastnost nebo pole jako povinné pro deserializaci JSON:
- Přidáním modifikátoru
required. - Tím, že ji JsonRequiredAttributeoznačíte .
- Úpravou vlastnosti JsonPropertyInfo.IsRequired modelu kontraktu.
Chcete-li určit, že všechny konstruktorové parametry jsou povinné pro deserializaci JSON, nastavte možnost JsonSerializerOptions.RespectRequiredConstructorParameters (nebo, v případě generování zdroje, vlastnost RespectRequiredConstructorParameters) na hodnotu true. Další informace naleznete v oddíle Nepovinné konstruktorové parametry.
Z pohledu serializátoru jsou modifikátor a required atribut jazyka C# [JsonRequired] ekvivalentní a oba mapují na stejnou část metadat, což je JsonPropertyInfo.IsRequired. Ve většině případů byste jednoduše použili integrované klíčové slovo jazyka C#. V následujících případech byste ale měli místo toho použít JsonRequiredAttribute :
- Pokud používáte jiný programovací jazyk než C# nebo nižší verzi jazyka C#.
- Pokud chcete, aby se požadavek použil pouze na deserializaci JSON.
- Pokud používáte
System.Text.Jsonserializaci v režimu generování zdrojového kódu. V takovém případě se váš kód nezkompiluje, pokud použijeterequiredmodifikátor, protože generování zdroje probíhá v době kompilace.
Následující fragment kódu ukazuje příklad vlastnosti upravené klíčovým slovem required . Tato vlastnost musí být k dispozici v datové části JSON, aby bylo možné provést deserializaci.
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; }
}
Alternativně můžete použít 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; }
}
Pomocí vlastnosti je také možné určit, jestli se vlastnost vyžaduje prostřednictvím modelu kontraktu JsonPropertyInfo.IsRequired :
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; }
}
Nepovinné parametry konstruktoru
Před verzí .NET 9 byla deserializace pomocí konstruktoru považována za takovou, která všetky parametry konstruktoru považuje za volitelné, jak ukazuje následující příklad:
var result = JsonSerializer.Deserialize<Person>("{}");
Console.WriteLine(result); // Person { Name = , Age = 0 }
record Person(string Name, int Age);
Počínaje rozhraním .NET 9 můžete příznak nastavit RespectRequiredConstructorParameters tak, aby podle potřeby zpracovával parametry konstruktoru, které nejsou volitelné.
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);
Přepínač funkce
Nastavení můžete zapnout RespectRequiredConstructorParameters globálně pomocí System.Text.Json.Serialization.RespectRequiredConstructorParametersDefault přepínače funkcí. Do souboru projektu přidejte následující položku MSBuild (například soubor .csproj ):
<ItemGroup>
<RuntimeHostConfigurationOption Include="System.Text.Json.Serialization.RespectRequiredConstructorParametersDefault" Value="true" />
</ItemGroup>
Rozhraní RespectRequiredConstructorParametersDefault API bylo implementováno jako příznak výslovného souhlasu v .NET 9, aby nedocházelo k přerušení stávajících aplikací. Pokud píšete novou aplikaci, důrazně doporučujeme povolit tento příznak ve svém kódu.