Cara mengabaikan properti dengan System.Text.Json
Saat menserialisasikan objek C# ke JavaScript Object Notation (JSON), secara default, seluruh properti publik akan terserialisasi. Jika Anda tidak ingin beberapa darinya muncul di JSON yang dihasilkan, Anda memiliki beberapa opsi. Dalam artikel ini, Anda mempelajari cara mengabaikan properti berdasarkan berbagai kriteria:
- Properti individu
- Seluruh properti baca-saja
- Seluruh properti nilai null
- Seluruh properti nilai default
Mengabaikan properti individu
Untuk mengabaikan properti individu, gunakan atribut [JsonIgnore].
Contoh berikut menunjukkan jenis untuk diserialisasikan. Ini juga menunjukkan 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,
}
Anda dapat menentukan pengecualian kondisional dengan mengatur properti atribut Condition
[JsonIgnore]. Enum JsonIgnoreCondition menyediakan opsi berikut:
Always
- Properti selalu diabaikan. Jika tidak adaCondition
yang ditentukan, opsi ini akan diasumsikan.Never
- Properti selalu diserialisasikan dan dideserialisasi, terlepas dari pengaturan globalDefaultIgnoreCondition
,IgnoreReadOnlyProperties
, danIgnoreReadOnlyFields
.WhenWritingDefault
- Properti diabaikan pada serialisasi jika berupa jenis referensinull
, jenis nilai yang dapat diubah ke nullnull
, atau jenis nilaidefault
.WhenWritingNull
- Properti diabaikan pada serialisasi jika berupa jenis referensinull
, atau jenis nilai yang dapat diubah ke nullnull
.
Contoh berikut mengilustrasikan penggunaan properti atribut 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}
Mengabaikan semua properti baca-saja
Suatu properti bersifat baca-saja jika berisi getter publik tetapi bukan setter publik. Untuk mengabaikan semua properti baca-saja saat membuat serialisasi, atur JsonSerializerOptions.IgnoreReadOnlyProperties ke true
, seperti yang diperlihatkan dalam contoh berikut:
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)
Contoh berikut menunjukkan jenis untuk diserialisasikan. Ini juga menunjukkan 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",
}
Opsi ini hanya berlaku untuk properti. Untuk mengabaikan bidang baca-saja saat membuat serialisasi bidang, gunakan JsonSerializerOptions.IgnoreReadOnlyFields pengaturan global.
Catatan
Properti jenis koleksi baca-saja masih diserialisasikan meskipun JsonSerializerOptions.IgnoreReadOnlyProperties diatur ke true
.
Mengabaikan semua properti nilai null
Untuk mengabaikan semua properti nilai null, atur properti DefaultIgnoreCondition ke WhenWritingNull, seperti yang diperlihatkan dalam contoh berikut:
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}
Mengabaikan semua properti nilai default
Untuk mencegah serialisasi nilai default dalam properti jenis nilai, atur properti DefaultIgnoreCondition ke WhenWritingDefault, seperti yang ditunjukkan dalam contoh berikut:
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"}
Pengaturan WhenWritingDefault ini juga mencegah serialisasi jenis referensi nilai null dan properti jenis nilai yang dapat diubah ke null.