Aracılığıyla paylaş


JSON'ı .NET nesneleri olarak okuma (seri durumdan çıkarma)

Bu makalede, JavaScript Nesne Gösterimi'nden (JSON) seri durumdan çıkarmak için ad alanının nasıl kullanılacağı System.Text.Json gösterilmektedir. mevcut kodu'ndan Newtonsoft.Jsontaşıma işlemini kullanıyorsanız bkz . Geçiş yöntemi System.Text.Json.

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 yöntemini çağırın JsonSerializer.Deserialize . 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. Zaman uyumlu veya zaman uyumsuz olarak seri durumdan çıkarabilirsiniz.

İpucu

GitHub Copilot ile JSON dizesini seri durumdan çıkarmak için yapay zeka yardımını kullanabilirsiniz.

Sınıfınızda temsil edilen tüm 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 bir JSON dizesinin seri durumdan nasıl çıkarılır 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}");
        }
    }
}
// output:
//Date: 8/1/2019 12:00:00 AM -07:00
//TemperatureCelsius: 25
//Summary: Hot
weatherForecast = JsonSerializer.Deserialize(Of WeatherForecastWithPOCOs)(jsonString)

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 yöntemini çağırın DeserializeAsync :

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)

Seri durumdan çıkarma 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.
  • Ortak olmayan oluşturucular seri hale getirici tarafından yoksayılır.
  • Ortak set erişimcileri olmayan sabit nesnelere veya özelliklere seri durumdan çıkarma desteklenir ancak varsayılan olarak etkinleştirilmez. Bkz . Sabit türler ve kayıtlar.
  • Sabit listeleri varsayılan olarak sayı olarak desteklenir. Dize sabit listesi 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 seri durumdan çıkarma

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.

  • Bir JSON DOM'un (belge nesne modeli) seri durumdan çıkarın ve DOM'dan ihtiyacınız 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 JsonNode bilgi için bkz . JSON yükünün alt dizilerini seri durumdan çıkarma. DOM hakkında JsonDocument bilgi için bkz . Bir JsonDocument ve JsonElement'de alt öğeleri arama.

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

    • Seri durumdan çıkarmak için ihtiyacınız olan JSON dosyasını kopyalayın.
    • Bir sınıf dosyası oluşturun ve şablon kodunu silin.
    • Özel>Yapıştır JSON'u Sınıflar Olarak Düzenle'yi>seçin.

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

UTF-8'den seri durumdan çıkarma

UTF-8'den seri durumdan çıkarmak için, aşağıdaki örneklerde gösterildiği gibi veya ReadOnlySpan<byte> alan bir JsonSerializer.Deserialize Utf8JsonReaderaşı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

JSON seri durumdan çıkarmak için GitHub Copilot kullanma

JSON'dan seri durumdan çıkarmak için kullanılan System.Text.Json kodu oluşturmak için IDE'nizde GitHub Copilot'ı kullanabilirsiniz.

Visual Studio 2022 sürüm 17.8 veya üzerini kullanıyorsanız, JSON'un seri durumdan çıkarılması için kullanılan System.Text.Json kod oluşturmak için Visual Studio'da yapay zeka temelli GitHub Copilot'ı deneyebilirsiniz. Sorunuzu, aşağıdaki örnekte olduğu gibi Copilot sohbet penceresinde bir istem olarak gönderin. Ayrıca, düzenleyici penceresinin kendisinde satır içi sohbeti kullanarak da istem gönderebilirsiniz.

Not

GitHub Copilot yapay zeka ile desteklendiğinden sürprizler ve hatalar mümkündür. Oluşturulan tüm kodları veya önerileri doğruladığından emin olun. GitHub Copilot'ın genel kullanımı, ürün etkisi, insan gözetimi ve gizlilik hakkında daha fazla bilgi için bkz . GitHub Copilot SSS.

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

{"FirstName":"John","LastName":"Doe","Age":30} JSON dizesini eşdeğer bir .NET nesnesine seri durumdan çıkarmak için kullanılacak System.Text.Json kod oluşturun. Özellik adlarını ve değerlerini eşleyin. Örnek çıkış sağlayın.

gereksinimlerinize uygun özellik adları ve değerleriyle bir JSON dizesi kullanmak için istem özelleştirebilirsiniz.

Amacı ayarlamak ve kapsamlı bağlamla daha iyi yanıtlar almak için eğik çizgi komutları, dosyalara, yöntemlere veya sınıflara başvurular ve iş parçacıkları gibi sohbet özelliklerini kullanabilirsiniz. IDE'de açık olan bir projedeki mevcut sınıf için GitHub Copilot'a ile /generate code to dserialize JSON to equivalent .NET object in #Filenamesorabilirsiniz.

Aşağıdaki çıkışta örnek bir Copilot Sohbet yanıtı gösterilmektedir:

Here's an example of how you can use `System.Text.Json` to deserialize a JSON string into a .NET object in C#:

using System;
using System.Text.Json;
public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}
public class Program
{
    public static void Main()
    {
        string jsonString = "{\"FirstName\":\"John\",\"LastName\":\"Doe\",\"Age\":30}";
        Person person = JsonSerializer.Deserialize<Person>(jsonString);
        Console.WriteLine($"FirstName: {person.FirstName}");
        Console.WriteLine($"LastName: {person.LastName}");
        Console.WriteLine($"Age: {person.Age}");
    }
}

**Example Output**
FirstName: John
LastName: Doe
Age: 30

This code defines a Person class with properties that match the JSON string. It then uses `JsonSerializer.Deserialize` to convert the JSON string into a `Person` object and prints the properties to the console.

Copilot bir kod bloğu döndürdüğünde, yanıt kodu kopyalama, kodu yeni bir dosyaya ekleme veya kod çıkışını önizleme seçenekleri içerir.

Not

Sonuçlarınız örnek yanıtlarda gösterilenden farklı olabilir. Yapay zeka modelleri belirlenemez, yani aynı soru sorulduğunda farklı yanıtlar döndürebilirler. Bunun nedeni zaman içindeki ek öğrenme ve uyum, dil varyasyonu, sohbet geçmişiniz gibi bağlam değişiklikleri ve daha fazlası olabilir.

Bir JSON dizesini .NET nesnesine seri durumdan çıkarmak için Visual Studio'da GitHub Copilot Sohbeti'nin kullanılmasını gösteren animasyonlu ekran görüntüsü.

Daha fazla bilgi için bkz.