Aracılığıyla paylaş


System.Text.Json ile özellikleri nasıl yoksayacağınızı öğrenin

C# nesneleri JavaScript Nesne Gösterimi'ne (JSON) serileştirilirken, varsayılan olarak tüm genel özellikler serileştirilir. Bunlardan bazılarının sonuçta elde edilen JSON'da görünmesini istemiyorsanız, birkaç seçeneğiniz vardır. Bu makalede, çeşitli ölçütlere göre özelliklerin nasıl yoksayılabileceğini öğreneceksiniz.

Tek tek özellikleri yoksay

Tek tek özellikleri yoksaymak için [JsonIgnore] özniteliğini kullanın.

Aşağıdaki örnekte seri hale getirecek bir tür gösterilmektedir. Ayrıca JSON çıkışını da gösterir:

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] özniteliğinin Condition özelliğini ayarlayarak koşullu dışlama belirtebilirsiniz. sabit JsonIgnoreCondition listesi aşağıdaki seçenekleri sağlar:

  • Always - Özelliği her zaman yoksayılır. Belirtilmezse Condition , bu seçenek varsayılır.
  • Never - Özellik, DefaultIgnoreCondition, IgnoreReadOnlyProperties, ve IgnoreReadOnlyFields küresel ayarlarından bağımsız olarak her zaman serileştirilir ve seri durumdan çıkarılır.
  • WhenWritingDefault - Özellik, serileştirme sırasında bir başvuru türüyse null, null atanabilir bir değer türüyse null, veya bir değer türüyse default yoksayılır.
  • WhenWritingNull- Özellik, bir başvuru türü null, veya null atanabilir bir değer türüyse null serileştirme sırasında yoksayılır.

Aşağıdaki örnekte [JsonIgnore] özniteliğinin özelliğinin kullanımı gösterilmektedir Condition :

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 Run()
        {
            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}

Tüm salt okunur özellikleri yoksay

Bir özellik, genel bir alıcı içeriyorsa ancak ortak ayarlayıcı içermiyorsa salt okunurdur. Seri hale getirildiğinde tüm salt okunur özellikleri yoksaymak içinJsonSerializerOptions.IgnoreReadOnlyProperties, aşağıdaki örnekte gösterildiği gibi değerini olarak ayarlayıntrue:

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)

Aşağıdaki örnekte seri hale getirecek bir tür gösterilmektedir. Ayrıca JSON çıkışını da gösterir:

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",
}

Bu seçenek yalnızca özellikler için geçerlidir. Alanları serileştirirken salt okunur alanları yoksaymak için JsonSerializerOptions.IgnoreReadOnlyFields global ayarı kullanın.

Uyarı

Salt okunur koleksiyon türü özellikleri, JsonSerializerOptions.IgnoreReadOnlyPropertiestrue olarak ayarlanmış olsa bile yine de seri hale getirilir.

Tüm null-değer özelliklerini yoksay

Tüm null-değer özelliklerini yoksaymak DefaultIgnoreConditioniçin, aşağıdaki örnekte gösterildiği gibi özelliğini olarak ayarlayınWhenWritingNull:

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 Run()
        {
            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}

Tüm varsayılan değer özelliklerini yoksay

Değer türü özelliklerindeki varsayılan değerlerin serileştirilmesini önlemek için, aşağıdaki örnekte gösterildiği gibi özelliğini DefaultIgnoreConditionolarak ayarlayınWhenWritingDefault:

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 Run()
        {
            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"}

Bu WhenWritingDefault ayar, null-değer başvuru türü ve null atanabilir değer türü özelliklerinin seri hale getirilmesini de engeller.

Ayrıca bakınız