Proprietà obbligatorie
È possibile contrassegnare determinate proprietà per indicare che devono essere presenti nel payload JSON affinché la deserializzazione abbia esito positivo. Analogamente, è possibile impostare un'opzione per specificare che tutti i parametri del costruttore non facoltativi sono presenti nel payload JSON. Se una o più di queste proprietà obbligatorie non sono presenti, i metodi JsonSerializer.Deserialize generano un'eccezione JsonException.
Esistono tre modi per contrassegnare una proprietà o un campo come obbligatorio per la deserializzazione JSON:
- Aggiungendo il
required
modificatore. - Annotandolo con JsonRequiredAttribute.
- Modificando la JsonPropertyInfo.IsRequired proprietà del modello di contratto.
Per specificare che tutti i parametri del costruttore non facoltativi sono necessari per la deserializzazione JSON, impostare l'opzione JsonSerializerOptions.RespectRequiredConstructorParameters (o, per la generazione di origine, RespectRequiredConstructorParameters la proprietà) su true
. Per altre informazioni, vedere la sezione Parametri del costruttore non facoltativo .
Dal punto di vista del serializzatore, il modificatore e [JsonRequired]
l'attributo C# required
sono equivalenti ed entrambi eseguono il mapping allo stesso frammento di metadati, ovvero JsonPropertyInfo.IsRequired. Nella maggior parte dei casi è sufficiente usare la parola chiave C# predefinita. Tuttavia, è consigliabile usare JsonRequiredAttribute nei casi seguenti:
- Se si usa un linguaggio di programmazione diverso da C# o una versione inferiore di C#.
- Se si vuole applicare solo il requisito alla deserializzazione JSON.
- Se si usa la serializzazione
System.Text.Json
in modalità di generazione dell'origine. In questo caso, il codice non verrà compilato se si usa il modificatorerequired
, perché la generazione dell'origine avviene in fase di compilazione.
Il frammento di codice seguente mostra un esempio di una proprietà modificata con la parola chiave required
. Questa proprietà deve essere presente nel payload JSON per consentire una corretta deserializzazione.
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; }
}
In alternativa, è possibile usare 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; }
}
È anche possibile controllare se una proprietà è obbligatoria tramite il modello di contratto usando la proprietà 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; }
}
Parametri del costruttore non facoltativi
Prima di .NET 9, la deserializzazione basata su costruttore considerava facoltativi tutti i parametri del costruttore, come illustrato nell'esempio seguente:
var result = JsonSerializer.Deserialize<Person>("{}");
Console.WriteLine(result); // Person { Name = , Age = 0 }
record Person(string Name, int Age);
A partire da .NET 9, è possibile impostare il RespectRequiredConstructorParameters flag per considerare i parametri del costruttore non facoltativi in base alle esigenze.
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);
Cambio di funzionalità
È possibile attivare l'impostazione a livello globale usando l'opzione RespectRequiredConstructorParameters
di System.Text.Json.Serialization.RespectRequiredConstructorParametersDefault
funzionalità. Aggiungere l'elemento MSBuild seguente al file di progetto (ad esempio, file con estensione csproj ):
<ItemGroup>
<RuntimeHostConfigurationOption Include="System.Text.Json.Serialization.RespectRequiredConstructorParametersDefault" Value="true" />
</ItemGroup>
L'API RespectRequiredConstructorParametersDefault
è stata implementata come flag di consenso esplicito in .NET 9 per evitare l'interruzione delle applicazioni esistenti. Se si sta scrivendo una nuova applicazione, è consigliabile abilitare questo flag nel codice.