Come ignorare le proprietà con System.Text.Json
Quando si serializzano oggetti C# in Notazione oggetti JavaScript (JSON), per impostazione predefinita, tutte le proprietà pubbliche vengono serializzate. Se non si vuole che alcuni di essi vengano visualizzati nel json risultante, sono disponibili diverse opzioni. In questo articolo viene illustrato come ignorare le proprietà in base a vari criteri:
Ignorare le singole proprietà
Per ignorare le singole proprietà, usare l'attributo [JsonIgnore].
Ecco un tipo di esempio per serializzare e output JSON:
public class WeatherForecastWithIgnoreAttribute
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
[JsonIgnore]
public string? Summary { get; set; }
}
Public Class WeatherForecastWithIgnoreAttribute
Public Property [Date] As DateTimeOffset
Public Property TemperatureCelsius As Integer
<JsonIgnore>
Public Property Summary As String
End Class
{
"Date": "2019-08-01T00:00:00-07:00",
"TemperatureCelsius": 25,
}
È possibile specificare l'esclusione condizionale impostando la proprietà dell'attributo Condition
[JsonIgnore]. L'enumerazione JsonIgnoreCondition offre le opzioni seguenti:
Always
- La proprietà viene sempre ignorata. Se nonCondition
viene specificato alcun valore, si presuppone che questa opzione venga eseguita.Never
- La proprietà viene sempre serializzata e deserializzata, indipendentemente dalleDefaultIgnoreCondition
impostazioni ,IgnoreReadOnlyProperties
eIgnoreReadOnlyFields
globali.WhenWritingDefault
- La proprietà viene ignorata nella serializzazione se è un tipo di riferimento , un tiponull
null
valore nullable o un tipo didefault
valore .WhenWritingNull
- La proprietà viene ignorata nella serializzazione se è un tipo di riferimento o un tiponull
dinull
valore nullable .
Nell'esempio seguente viene illustrato l'uso della proprietà dell'attributo Condition
[JsonIgnore]:
using System.Text.Json;
using System.Text.Json.Serialization;
namespace JsonIgnoreAttributeExample
{
public class Forecast
{
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public DateTime Date { get; set; }
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]
public int TemperatureC { get; set; }
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public string? Summary { get; set; }
};
public class Program
{
public static void Main()
{
Forecast forecast = new()
{
Date = default,
Summary = null,
TemperatureC = default
};
JsonSerializerOptions options = new()
{
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault
};
string forecastJson =
JsonSerializer.Serialize<Forecast>(forecast,options);
Console.WriteLine(forecastJson);
}
}
}
// Produces output like the following example:
//
//{"TemperatureC":0}
Imports System.Text.Json
Imports System.Text.Json.Serialization
Namespace JsonIgnoreAttributeExample
Public Class Forecast
<JsonIgnore(Condition:=JsonIgnoreCondition.WhenWritingDefault)>
Public Property [Date] As Date
<JsonIgnore(Condition:=JsonIgnoreCondition.Never)>
Public Property TemperatureC As Integer
<JsonIgnore(Condition:=JsonIgnoreCondition.WhenWritingNull)>
Public Property Summary As String
End Class
Public NotInheritable Class Program
Public Shared Sub Main()
Dim forecast1 As New Forecast() With {
.[Date] = CType(Nothing, Date),
.Summary = Nothing,
.TemperatureC = CType(Nothing, Integer)
}
Dim options As New JsonSerializerOptions() With {
.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault
}
Dim forecastJson As String = JsonSerializer.Serialize(forecast1, options)
Console.WriteLine(forecastJson)
End Sub
End Class
End Namespace
' Produces output like the following example:
'
'{"TemperatureC":0}
Ignorare tutte le proprietà di sola lettura
Una proprietà è di sola lettura se contiene un getter pubblico ma non un setter pubblico. Per ignorare tutte le proprietà di sola lettura durante la serializzazione, impostare su , come illustrato nell'esempio JsonSerializerOptions.IgnoreReadOnlyPropertiestrue
seguente:
var options = new JsonSerializerOptions
{
IgnoreReadOnlyProperties = true,
WriteIndented = true
};
jsonString = JsonSerializer.Serialize(weatherForecast, options);
Dim options As JsonSerializerOptions = New JsonSerializerOptions With {
.IgnoreReadOnlyProperties = True,
.WriteIndented = True
}
jsonString = JsonSerializer.Serialize(weatherForecast, options)
Ecco un tipo di esempio per serializzare e output JSON:
public class WeatherForecastWithROProperty
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string? Summary { get; set; }
public int WindSpeedReadOnly { get; private set; } = 35;
}
Public Class WeatherForecastWithROProperty
Public Property [Date] As DateTimeOffset
Public Property TemperatureCelsius As Integer
Public Property Summary As String
Private _windSpeedReadOnly As Integer
Public Property WindSpeedReadOnly As Integer
Get
Return _windSpeedReadOnly
End Get
Private Set(Value As Integer)
_windSpeedReadOnly = Value
End Set
End Property
End Class
{
"Date": "2019-08-01T00:00:00-07:00",
"TemperatureCelsius": 25,
"Summary": "Hot",
}
Questa opzione si applica solo alla serializzazione. Durante la deserializzazione, le proprietà di sola lettura vengono ignorate per impostazione predefinita.
Questa opzione si applica solo alle proprietà. Per ignorare i campi di sola lettura durante la serializzazione dei campi, usare l'impostazione JsonSerializerOptions.IgnoreReadOnlyFields globale.
Ignorare tutte le proprietà null-value
Per ignorare tutte le proprietà null-value, impostare la proprietà su WhenWritingNull, come illustrato nell'esempio DefaultIgnoreCondition seguente:
using System.Text.Json;
using System.Text.Json.Serialization;
namespace IgnoreNullOnSerialize
{
public class Forecast
{
public DateTime Date { get; set; }
public int TemperatureC { get; set; }
public string? Summary { get; set; }
};
public class Program
{
public static void Main()
{
Forecast forecast = new()
{
Date = DateTime.Now,
Summary = null,
TemperatureC = default
};
JsonSerializerOptions options = new()
{
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
};
string forecastJson =
JsonSerializer.Serialize<Forecast>(forecast, options);
Console.WriteLine(forecastJson);
}
}
}
// Produces output like the following example:
//
//{"Date":"2020-10-30T10:11:40.2359135-07:00","TemperatureC":0}
Imports System.Text.Json
Namespace IgnoreNullOnSerialize
Public Class Forecast
Public Property [Date] As Date
Public Property TemperatureC As Integer
Public Property Summary As String
End Class
Public NotInheritable Class Program
Public Shared Sub Main()
Dim forecast1 As New Forecast() With
{
.[Date] = Date.Now,
.Summary = Nothing,
.TemperatureC = CType(Nothing, Integer)
}
Dim options As New JsonSerializerOptions
Dim forecastJson As String = JsonSerializer.Serialize(forecast1, options)
Console.WriteLine(forecastJson)
End Sub
End Class
End Namespace
' Produces output like the following example:
'
'{"Date":"2020-10-30T10:11:40.2359135-07:00","TemperatureC":0}
Per ignorare tutte le proprietà null-value durante la serializzazione o la deserializzazione, impostare la IgnoreNullValues proprietà su true
. Nell'esempio seguente viene illustrata questa opzione usata per la serializzazione:
var options = new JsonSerializerOptions
{
IgnoreNullValues = true,
WriteIndented = true
};
jsonString = JsonSerializer.Serialize(weatherForecast, options);
Dim options As JsonSerializerOptions = New JsonSerializerOptions With {
.IgnoreNullValues = True,
.WriteIndented = True
}
jsonString = JsonSerializer.Serialize(weatherForecast1, options)
Ecco un oggetto di esempio per serializzare e output JSON:
Proprietà | Valore |
---|---|
Date |
8/1/2019 12:00:00 AM -07:00 |
TemperatureCelsius |
25 |
Summary |
null |
{
"Date": "2019-08-01T00:00:00-07:00",
"TemperatureCelsius": 25
}
Nota
La IgnoreNullValues proprietà è deprecata in .NET 5 e versioni successive. Per ignorare i valori Null, vedere come ignorare tutte le proprietà null-value in .NET 5 e versioni successive.
Ignorare tutte le proprietà predefinite
Per impedire la serializzazione dei valori predefiniti nelle proprietà del tipo di valore, impostare la DefaultIgnoreCondition proprietà su WhenWritingDefault, come illustrato nell'esempio seguente:
using System.Text.Json;
using System.Text.Json.Serialization;
namespace IgnoreValueDefaultOnSerialize
{
public class Forecast
{
public DateTime Date { get; set; }
public int TemperatureC { get; set; }
public string? Summary { get; set; }
};
public class Program
{
public static void Main()
{
Forecast forecast = new()
{
Date = DateTime.Now,
Summary = null,
TemperatureC = default
};
JsonSerializerOptions options = new()
{
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault
};
string forecastJson =
JsonSerializer.Serialize<Forecast>(forecast, options);
Console.WriteLine(forecastJson);
}
}
}
// Produces output like the following example:
//
//{ "Date":"2020-10-21T15:40:06.8920138-07:00"}
Imports System.Text.Json
Imports System.Text.Json.Serialization
Namespace IgnoreValueDefaultOnSerialize
Public Class Forecast
Public Property [Date] As Date
Public Property TemperatureC As Integer
Public Property Summary As String
End Class
Public NotInheritable Class Program
Public Shared Sub Main()
Dim forecast1 As New Forecast() With
{.[Date] = Date.Now,
.Summary = Nothing,
.TemperatureC = CType(Nothing, Integer)
}
Dim options As New JsonSerializerOptions() With {
.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault
}
Dim forecastJson As String = JsonSerializer.Serialize(forecast1, options)
Console.WriteLine(forecastJson)
End Sub
End Class
End Namespace
' Produces output like the following example:
'
'{ "Date":"2020-10-21T15:40:06.8920138-07:00"}
L'impostazione WhenWritingDefault impedisce anche la serializzazione delle proprietà del tipo di riferimento null-value e del tipo di valore nullable.
Non esiste alcun modo predefinito per impedire la serializzazione delle proprietà con valori predefiniti in System.Text.Json
.NET Core 3.1.
Vedi anche
- System.Text.Json Panoramica
- Come serializzare e deserializzare dati JSON
- Creare un'istanza di istanze jsonSerializerOptions
- Abilitare la corrispondenza che non fa distinzione tra maiuscole e minuscole
- Personalizzare nomi e valori di proprietà
- Consentire JSON non valido
- Gestire json di overflow o usare JsonElement o JsonNode
- Mantenere i riferimenti e gestire riferimenti circolari
- Deserializzare i tipi non modificabili e le funzioni di accesso non pubbliche
- Serializzazione polimorfica
- Eseguire la migrazione da Newtonsoft.Json a System.Text.Json
- Personalizzare la codifica dei caratteri
- Usare DOM, Utf8JsonReader e Utf8JsonWriter
- Scrivere convertitori personalizzati per la serializzazione JSON
- Supporto di DateTime e DateTimeOffset
- Come usare la generazione di origine
- Tipi di raccolta supportati
- System.Text.Json Informazioni di riferimento sulle API
- System.Text.Json. Informazioni di riferimento sulle API di serializzazione