Aracılığıyla paylaş


JSON'ı .NET nesneleri olarak okuma (deseriyalize etme)

Bu makalede, JavaScript Nesne Gösterimi'nden (JSON) seri durumdan çıkarmak için System.Text.Json ad alanının nasıl kullanılacağı gösterilmektedir. Mevcut kodu Newtonsoft.Json üzerinden aktarıyorsanız, System.Text.Json'e nasıl geçiş yapılacağını inceleyin.

JSON seri durumdan çıkarmanın yaygın yollarından biri, bir veya daha fazla JSON özelliğini temsil eden özelliklere ve alanlara sahip bir .NET sınıfına sahip olmaktır (veya oluşturmaktır). Ardından, bir dizeden veya dosyadan seri durumdan çıkarmak için JsonSerializer.Deserialize yöntemini çağırın. Genel aşırı yüklemeler için genel tür parametresi .NET sınıfıdır. Genel olmayan aşırı yüklemeler için sınıfın türünü yöntem parametresi olarak geçirirsiniz. Eş zamanlı veya eş zamansız olarak seri durumdan çıkarabilirsiniz.

İpucu

JSON dizesini seri durumdan çıkarmak için yapay zeka yardımı kullanabilirsiniz.

Sınıfınızda temsil edilmeyen JSON özellikleri varsayılan olarak yoksayılır. Ayrıca, türdeki özellikler gerekliyse ancak JSON yükünde yoksa seri durumdan çıkarma başarısız olur.

Örnekler

Aşağıdaki örnekte koleksiyonlar ve iç içe nesneler içeren bir JSON dizesinin seri durumdan nasıl çıkarıldığını gösterilmektedir:

using System.Text.Json;

namespace DeserializeExtra
{
    public class WeatherForecast
    {
        public DateTimeOffset Date { get; set; }
        public int TemperatureCelsius { get; set; }
        public string? Summary { get; set; }
        public string? SummaryField;
        public IList<DateTimeOffset>? DatesAvailable { get; set; }
        public Dictionary<string, HighLowTemps>? TemperatureRanges { get; set; }
        public string[]? SummaryWords { get; set; }
    }

    public class HighLowTemps
    {
        public int High { get; set; }
        public int Low { get; set; }
    }

    public class Program
    {
        public static void Main()
        {
            string jsonString =
                """
                {
                  "Date": "2019-08-01T00:00:00-07:00",
                  "TemperatureCelsius": 25,
                  "Summary": "Hot",
                  "DatesAvailable": [
                    "2019-08-01T00:00:00-07:00",
                    "2019-08-02T00:00:00-07:00"
                  ],
                  "TemperatureRanges": {
                    "Cold": {
                      "High": 20,
                      "Low": -10
                    },
                    "Hot": {
                      "High": 60,
                      "Low": 20
                    }
                  },
                  "SummaryWords": [
                    "Cool",
                    "Windy",
                    "Humid"
                  ]
                }
                """;
                
            WeatherForecast? weatherForecast = 
                JsonSerializer.Deserialize<WeatherForecast>(jsonString);

            Console.WriteLine($"Date: {weatherForecast?.Date}");
            Console.WriteLine($"TemperatureCelsius: {weatherForecast?.TemperatureCelsius}");
            Console.WriteLine($"Summary: {weatherForecast?.Summary}");

            if (weatherForecast?.DatesAvailable != null)
            {
                foreach (DateTimeOffset dateTimeOffset in weatherForecast.DatesAvailable)
                {
                    Console.WriteLine($"DateAvailable: {dateTimeOffset}");
                }
            }

            if (weatherForecast?.TemperatureRanges != null)
            {
                foreach (KeyValuePair<string, HighLowTemps> temperatureRange in weatherForecast.TemperatureRanges)
                {
                    Console.WriteLine($"TemperatureRange: {temperatureRange.Key} is {temperatureRange.Value.Low} to {temperatureRange.Value.High}");
                }
            }

            if (weatherForecast?.SummaryWords != null)
            {
                foreach (string summaryWord in weatherForecast.SummaryWords)
                {
                    Console.WriteLine($"SummaryWord: {summaryWord}");
                }
            }
        }
    }
}

/* Output:
 * 
 * Date: 8/1/2019 12:00:00 AM -07:00
 * TemperatureCelsius: 25
 * Summary: Hot
 * DateAvailable: 8/1/2019 12:00:00 AM -07:00
 * DateAvailable: 8/2/2019 12:00:00 AM -07:00
 * TemperatureRange: Cold is -10 to 20
 * TemperatureRange: Hot is 20 to 60
 * SummaryWord: Cool
 * SummaryWord: Windy
 * SummaryWord: Humid
 * */
Imports System.Text.Json

Namespace DeserializeExtra

    Public Class WeatherForecast
        Public Property [Date] As DateTimeOffset
        Public Property TemperatureCelsius As Integer
        Public Property Summary As String
        Public SummaryField As String
        Public Property DatesAvailable As IList(Of DateTimeOffset)
        Public Property TemperatureRanges As Dictionary(Of String, HighLowTemps)
        Public Property SummaryWords As String()
    End Class

    Public Class HighLowTemps
        Public Property High As Integer
        Public Property Low As Integer
    End Class

    Public NotInheritable Class Program

        Public Shared Sub Run()
            Dim jsonString As String =
                "{
                  ""Date"": ""2019-08-01T00:00:00-07:00"",
                  ""TemperatureCelsius"": 25,
                  ""Summary"": ""Hot"",
                  ""DatesAvailable"": [
                    ""2019-08-01T00:00:00-07:00"",
                    ""2019-08-02T00:00:00-07:00""
                  ],
                  ""TemperatureRanges"": {
                    ""Cold"": {
                      ""High"": 20,
                      ""Low"": -10
                    },
                    ""Hot"": {
                      ""High"": 60,
                      ""Low"": 20
                    }
                  },
                  ""SummaryWords"": [
                    ""Cool"",
                    ""Windy"",
                    ""Humid""
                  ]
                }"

            Dim weatherForecast As WeatherForecast =
                JsonSerializer.Deserialize(Of WeatherForecast)(jsonString)

            Console.WriteLine($"Date: {weatherForecast?.Date}")
            Console.WriteLine($"TemperatureCelsius: {weatherForecast?.TemperatureCelsius}")
            Console.WriteLine($"Summary: {weatherForecast?.Summary}")

            If weatherForecast?.DatesAvailable IsNot Nothing Then
                For Each dateTimeOffset As DateTimeOffset In weatherForecast.DatesAvailable
                    Console.WriteLine($"DateAvailable: {dateTimeOffset}")
                Next
            End If

            If weatherForecast?.TemperatureRanges IsNot Nothing Then
                For Each temperatureRange As KeyValuePair(Of String, HighLowTemps) In weatherForecast.TemperatureRanges
                    Console.WriteLine($"TemperatureRange: {temperatureRange.Key} is {temperatureRange.Value.Low} to {temperatureRange.Value.High}")
                Next
            End If

            If weatherForecast?.SummaryWords IsNot Nothing Then
                For Each summaryWord As String In weatherForecast.SummaryWords
                    Console.WriteLine($"SummaryWord: {summaryWord}")
                Next
            End If
        End Sub

    End Class

End Namespace

' Output:
'
'Date: 8/1/2019 12:00:00 AM -07:00
'TemperatureCelsius: 25
'Summary: Hot
'DateAvailable: 8/1/2019 12:00:00 AM -07:00
'DateAvailable: 8/2/2019 12:00:00 AM -07:00
'TemperatureRange: Cold is -10 to 20
'TemperatureRange: Hot is 20 to 60
'SummaryWord: Cool
'SummaryWord: Windy
'SummaryWord: Humid

Zaman uyumlu kod kullanarak bir dosyadan seri durumdan çıkarmak için, aşağıdaki örnekte gösterildiği gibi dosyayı bir dizeye okuyun:

using System.Text.Json;

namespace DeserializeFromFile
{
    public class WeatherForecast
    {
        public DateTimeOffset Date { get; set; }
        public int TemperatureCelsius { get; set; }
        public string? Summary { get; set; }
    }

    public class Program
    {
        public static void Main()
        {
            string fileName = "WeatherForecast.json";
            string jsonString = File.ReadAllText(fileName);
            WeatherForecast weatherForecast = JsonSerializer.Deserialize<WeatherForecast>(jsonString)!;

            Console.WriteLine($"Date: {weatherForecast.Date}");
            Console.WriteLine($"TemperatureCelsius: {weatherForecast.TemperatureCelsius}");
            Console.WriteLine($"Summary: {weatherForecast.Summary}");
        }
    }
}
// output:
//Date: 8/1/2019 12:00:00 AM -07:00
//TemperatureCelsius: 25
//Summary: Hot
jsonString = File.ReadAllText(fileName)
weatherForecast1 = JsonSerializer.Deserialize(Of WeatherForecast)(jsonString)

Zaman uyumsuz kod kullanarak bir dosyadan seri durumdan çıkarmak için DeserializeAsync yöntemini çağırın.

using System.Text.Json;

namespace DeserializeFromFileAsync
{
    public class WeatherForecast
    {
        public DateTimeOffset Date { get; set; }
        public int TemperatureCelsius { get; set; }
        public string? Summary { get; set; }
    }

    public class Program
    {
        public static async Task Main()
        {
            string fileName = "WeatherForecast.json";
            using FileStream openStream = File.OpenRead(fileName);
            WeatherForecast? weatherForecast = 
                await JsonSerializer.DeserializeAsync<WeatherForecast>(openStream);

            Console.WriteLine($"Date: {weatherForecast?.Date}");
            Console.WriteLine($"TemperatureCelsius: {weatherForecast?.TemperatureCelsius}");
            Console.WriteLine($"Summary: {weatherForecast?.Summary}");
        }
    }
}
// output:
//Date: 8/1/2019 12:00:00 AM -07:00
//TemperatureCelsius: 25
//Summary: Hot
Dim openStream As FileStream = File.OpenRead(fileName)
weatherForecast1 = Await JsonSerializer.DeserializeAsync(Of WeatherForecast)(openStream)

Deserilize etme davranışı

JSON seri durumdan çıkarılırken aşağıdaki davranışlar geçerlidir:

  • Varsayılan olarak, özellik adı eşleştirme büyük/küçük harfe duyarlıdır. Büyük/küçük harfe duyarsızlığı belirtebilirsiniz.
  • Özel/erişilemez oluşturucular seri hale getirici tarafından yoksayılır.
  • Varsayılan olarak etkinleştirilmemiş olsa da, ortak set erişimcilerine sahip olmayan değiştirilemez nesnelerin veya özelliklerin seri durumdan çıkarılması desteklenir. Bkz . Sabit türler ve kayıtlar.
  • Numaralandırmalar varsayılan olarak sayı olarak desteklenir. Dize enum alanlarını seri durumdan çıkarabilirsiniz.
  • Varsayılan olarak alanlar yoksayılır. Alanları ekleyebilirsiniz.
  • Varsayılan olarak, JSON içindeki açıklamalar veya sondaki virgüller özel durumlar oluşturur. Açıklamalara ve sondaki virgüllere izin vekleyebilirsiniz.
  • Varsayılan maksimum derinlik 64'dür.

ASP.NET Core uygulamasında dolaylı olarak kullandığınızda System.Text.Json bazı varsayılan davranışlar farklıdır. Daha fazla bilgi için bkz . JsonSerializerOptions için web varsayılanları.

Yerleşik dönüştürücüler tarafından desteklenmeyen işlevler sağlamak için özel dönüştürücüler uygulayabilirsiniz.

.NET sınıfı olmadan serileştirme işlemini geri alma

Seri durumdan çıkarmak istediğiniz JSON'larınız varsa ve seri durumdan çıkarabileceğiniz sınıfınız yoksa, ihtiyacınız olan sınıfı el ile oluşturma dışında seçenekleriniz vardır:

  • Utf8JsonReader'i doğrudan kullanın.

  • JSON DOM'u (belge nesne modeli) deseriyalize edin ve DOM'dan gerekli olanları ayıklayın.

    DOM, bir JSON yükünün alt bölümüne gitmenize ve tek bir değeri, özel türü veya diziyi seri durumdan çıkarmanıza olanak tanır. DOM hakkında bilgi için bkz: JsonNode. DOM hakkında JsonDocument bilgi için bkz. Bir JsonDocument ve JsonElement içinde alt öğeleri nasıl arayacağınız.

  • İhtiyacınız olan sınıfı otomatik olarak oluşturmak için Visual Studio 2022 veya üzerini kullanın:

    • Çözmeniz gereken JSON'u kopyalayın.
    • Bir sınıf dosyası oluşturun ve şablon kodunu silin.
    • Düzenle> seçtikten sonra Özel Yapıştır> ve JSON'u Sınıf Olarak Yapıştır seçeneklerini kullanın.

    Sonuç, seri durumdan çıkarma hedefiniz için kullanabileceğiniz bir sınıftır.

UTF-8'den deseriyalizasyon

UTF-8'den seri durumdan çıkarmak için, aşağıdaki örneklerde gösterildiği gibi bir JsonSerializer.Deserialize veya bir ReadOnlySpan<byte> ya da Utf8JsonReader alan bir aşırı yüklemeyi çağırın. Örneklerde JSON'un jsonUtf8Bytes adlı bir bayt dizisinde olduğu varsayılır.

var readOnlySpan = new ReadOnlySpan<byte>(jsonUtf8Bytes);
WeatherForecast deserializedWeatherForecast = 
    JsonSerializer.Deserialize<WeatherForecast>(readOnlySpan)!;
Dim jsonString = Encoding.UTF8.GetString(jsonUtf8Bytes)
weatherForecast1 = JsonSerializer.Deserialize(Of WeatherForecast)(jsonString)
var utf8Reader = new Utf8JsonReader(jsonUtf8Bytes);
WeatherForecast deserializedWeatherForecast = 
    JsonSerializer.Deserialize<WeatherForecast>(ref utf8Reader)!;
' This code example doesn't apply to Visual Basic. For more information, go to the following URL:
' https://learn.microsoft.com/dotnet/standard/serialization/system-text-json-how-to#visual-basic-support

Yapay zekayı kullanarak JSON'u çözüp dönüştürün.

JSON'dan veri seri durumdan çıkarmak için System.Text.Json kullanan kodu oluşturmak amacıyla GitHub Copilot gibi yapay zeka araçlarını kullanabilirsiniz. Örneğin, hedef sınıf JSON girişinde eksik olan bir özelliği tanımladığında seri durumdan çıkarma işlemini göstermek için istemi özelleştirebilirsiniz.

Aşağıdaki metinde Copilot Sohbeti için örnek bir istem gösterilmektedir:

Generate C# code to use System.Text.Json to deserialize a JSON string {"FirstName":"John","LastName":"Doe"} to an equivalent .NET object, where the class defines an Age property.
Show what happens when the JSON is missing a property defined in the class.
Provide example output.

Uygulamadan önce Copilot'un önerilerini gözden geçirin.

GitHub Copilot hakkında daha fazla bilgi için bkz. GitHub'ın SSS'leri.

Ayrıca bakınız