Požadované vlastnosti
Počínaje rozhraním .NET 7 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. Pokud některé z těchto požadovaných vlastností nejsou přítomny JsonSerializer.Deserialize , metody vyvolá výjimku JsonException.
Existují tři způsoby, jak označit vlastnost nebo pole jako povinné pro deserializaci JSON:
- Přidáním požadovaného modifikátoru, který je v jazyce C# 11 nový.
- Tím, že ji označíte poznámkou JsonRequiredAttribute, která je v .NET 7 nová.
- Úpravou vlastnosti modelu kontraktu JsonPropertyInfo.IsRequired , který je nový v .NET 7.
Z pohledu serializátoru jsou tyto dvě demarace 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.Json
serializaci v režimu generování zdroje. V takovém případě se váš kód nezkompiluje, pokud použijeterequired
modifiká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.
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; }
}
Alternativně můžete použít 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; }
}
Pomocí vlastnosti je také možné určit, jestli se vlastnost vyžaduje prostřednictvím modelu kontraktu JsonPropertyInfo.IsRequired :
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);
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro