System.Text.Json でプロパティを無視する方法
C# オブジェクトを JavaScript Object Notation (JSON) にシリアル化する場合、既定では、すべてのパブリック プロパティがシリアル化されます。 生成される JSON にその一部を出現させないようにするには、いくつかのオプションがあります。 この記事では、さまざまな条件に基づいてプロパティを無視する方法について説明します。
個々のプロパティを無視する
個々のプロパティを無視するには、[JsonIgnore] 属性を使用します。
シリアル化する型と 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,
}
[JsonIgnore] 属性の プロパティを設定することによって、条件付き除外を指定できます。 JsonIgnoreCondition 列挙型には、次のオプションがあります。
Always
- プロパティを常に無視します。Condition
を指定しないと、このオプションが想定されます。Never
- グローバル設定DefaultIgnoreCondition
、IgnoreReadOnlyProperties
、IgnoreReadOnlyFields
に関係なく、プロパティは常にシリアル化および逆シリアル化されます。WhenWritingDefault
- プロパティが参照型null
、null 許容値型null
、または値型default
の場合、シリアル化時に無視されます。WhenWritingNull
- プロパティが参照型null
または null 許容値型null
の場合、シリアル化時に無視されます。
次の例では、[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}
すべての読み取り専用プロパティを無視する
パブリック ゲッターが含まれていてもパブリック セッターがない場合、プロパティは読み取り専用です。 シリアル化のときにすべての読み取り専用プロパティを無視するには、次の例で示されているように、JsonSerializerOptions.IgnoreReadOnlyProperties を true
に設定します。
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)
シリアル化する型と 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",
}
このオプションは、シリアル化にのみ適用されます。 逆シリアル化中、既定では読み取り専用プロパティが無視されます。
このオプションは、プロパティにのみ適用されます。 フィールドをシリアル化するときに読み取り専用フィールドを無視するには、 グローバル設定を使用します。
すべての null 値プロパティを無視する
すべての null 値プロパティを無視するには、次の例で示されているように、DefaultIgnoreCondition プロパティを WhenWritingNull に設定します。
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}
シリアル化または逆シリアル化のときにすべての null 値プロパティを無視するには、IgnoreNullValues プロパティを true
に設定します。 次の例は、シリアル化に使用されるこのオプションを示しています。
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)
シリアル化するオブジェクトと JSON 出力の例を次に示します。
プロパティ | 値 |
---|---|
Date |
8/1/2019 12:00:00 AM -07:00 |
TemperatureCelsius |
25 |
Summary |
null |
{
"Date": "2019-08-01T00:00:00-07:00",
"TemperatureCelsius": 25
}
注意
IgnoreNullValues プロパティは、.NET 5 以降のバージョンでは非推奨になっています。 null 値を無視する現在の方法については、.NET 5 以降ですべての null 値プロパティを無視する 方法に関するページを参照してください。
既定値のプロパティをすべて無視する
値型プロパティで既定値がシリアル化されないようにするには、次の例で示されているように、DefaultIgnoreCondition プロパティを WhenWritingDefault に設定します。
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"}
WhenWritingDefault を設定すると、null 値参照型および null 許容値型のプロパティもシリアル化されなくなります。
.NET Core 3.1 の System.Text.Json
で、値型の既定値のプロパティがシリアル化されないようにするための組み込みの方法はありません。
関連項目
- の概要
- JSON をシリアル化および逆シリアル化する方法
- JsonSerializerOptions インスタンスのインスタンスを作成する
- 大文字と小文字を区別しない一致を有効にする
- プロパティの名前と値をカスタマイズする
- 無効な JSON を許可する
- オーバーフロー JSON を処理するか、JsonElement または JsonNode を使用する
- 参照を保持し、循環参照を処理する
- 変更できない型と非パブリック アクセサーに逆シリアル化する
- ポリモーフィックなシリアル化
- から System.Text.Json に移行する
- 文字エンコードをカスタマイズする
- DOM、Utf8JsonReader、Utf8JsonWriter を使用する
- JSON シリアル化のためのカスタム コンバーターの作成
- DateTime および DateTimeOffset のサポート
- ソース生成を使用する方法
- サポートされているコレクション型
- API リファレンス
- .Serialization API リファレンス