Udostępnij za pośrednictwem


Jak odczytać kod JSON jako obiekty platformy .NET (deserializacji)

W tym artykule pokazano, jak używać System.Text.Json przestrzeni nazw do deserializacji z pliku JavaScript Object Notation (JSON). Jeśli przenosisz istniejący kod z Newtonsoft.Jsonprogramu , zobacz Jak przeprowadzić migrację do System.Text.Jsonprogramu .

Typowym sposobem deserializacji danych JSON jest posiadanie (lub utworzenie) klasy .NET z właściwościami i polami reprezentującymi co najmniej jedną właściwości JSON. Następnie, aby deserializować z ciągu lub pliku, wywołaj metodę JsonSerializer.Deserialize . W przypadku przeciążeń ogólnych parametr typu ogólnego jest klasą .NET. W przypadku przeciążeń innych niż ogólne należy przekazać typ klasy jako parametr metody. Można deserializować synchronicznie lub asynchronicznie.

Wszystkie właściwości JSON, które nie są reprezentowane w klasie, są domyślnie ignorowane. Ponadto, jeśli jakiekolwiek właściwości typu są wymagane , ale nie są obecne w ładunku JSON, deserializacja zakończy się niepowodzeniem.

Przykłady

W poniższym przykładzie pokazano, jak deserializować ciąg JSON:

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)

Aby wykonać deserializacji z pliku przy użyciu kodu synchronicznego, odczytaj plik w ciągu, jak pokazano w poniższym przykładzie:

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)

Aby wykonać deserializowanie z pliku przy użyciu kodu asynchronicznego, wywołaj metodę 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)

Zachowanie deserializacji

Podczas deserializacji kodu JSON obowiązują następujące zachowania:

Jeśli używasz System.Text.Json pośrednio w aplikacji ASP.NET Core, niektóre zachowania domyślne są inne. Aby uzyskać więcej informacji, zobacz Ustawienia domyślne sieci Web dla JsonSerializerOptions.

Możesz zaimplementować konwertery niestandardowe, aby zapewnić funkcjonalność, która nie jest obsługiwana przez wbudowane konwertery.

Deserializowanie bez klasy platformy .NET

Jeśli masz kod JSON, który chcesz wykonać deserializacji i nie masz klasy do deserializacji, masz inne opcje niż ręczne tworzenie potrzebnej klasy:

  • Użyj bezpośrednio pliku Utf8JsonReader .

  • Deserializuj do modelu DOM w formacie JSON (model obiektu dokumentu) i wyodrębnij potrzebne elementy z modelu DOM.

    Dom umożliwia przejście do podsekcji ładunku JSON i deserializacji pojedynczej wartości, typu niestandardowego lub tablicy. Aby uzyskać informacje na temat modelu JsonNode DOM, zobacz podsekcje Deserialize ładunku JSON. Aby uzyskać informacje na temat modelu JsonDocument DOM, zobacz Jak wyszukać elementy podrzędne JsonDocument i JsonElement.

  • Użyj programu Visual Studio 2022, aby automatycznie wygenerować potrzebną klasę:

    • Skopiuj kod JSON, który należy wykonać deserializacji.
    • Utwórz plik klasy i usuń kod szablonu.
    • Wybierz pozycję Edytuj>wklej specjalny>kod JSON wklej jako klasy.

    Wynikiem jest klasa, której można użyć dla celu deserializacji.

Deserializowanie z utF-8

Aby wykonać deserializacji z utF-8, wywołaj JsonSerializer.Deserialize przeciążenie, które przyjmuje ReadOnlySpan<byte> wartość lub Utf8JsonReader, jak pokazano w poniższych przykładach. W przykładach przyjęto założenie, że kod JSON znajduje się w tablicy bajtów o nazwie jsonUtf8Bytes.

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

Deserializowanie kodu JSON przy użyciu narzędzia GitHub Copilot

Możesz użyć narzędzia GitHub Copilot w środowisku IDE, aby wygenerować kod używany System.Text.Json do deserializacji z formatu JSON.

Jeśli używasz programu Visual Studio 2022 w wersji 17.8 lub nowszej, możesz wypróbować oparte na sztucznej inteligencji narzędzie GitHub Copilot w programie Visual Studio , aby wygenerować kod używany System.Text.Json do deserializacji kodu JSON. Prześlij swoje pytanie jako monit w oknie czatu Copilot, jak w poniższym przykładzie. Możesz również przesyłać monity przy użyciu wbudowanego czatu w samym oknie edytora.

Uwaga

Narzędzie GitHub Copilot jest obsługiwane przez sztuczną inteligencję, więc możliwe są niespodzianki i błędy. Upewnij się, że zweryfikowano wygenerowany kod lub sugestie. Aby uzyskać więcej informacji na temat ogólnego użycia narzędzia GitHub Copilot, wpływu produktu, nadzoru ludzkiego i prywatności, zobacz GitHub Copilot — często zadawane pytania.

Poniższy tekst przedstawia przykładowy monit dotyczący czatu copilot:

Generowanie kodu służącego System.Text.Json do deserializacji ciągu JSON {"FirstName":"John","LastName":"Doe","Age":30} do równoważnego obiektu .NET. Mapowanie nazw właściwości i wartości. Podaj przykładowe dane wyjściowe.

Możesz dostosować monit, aby użyć ciągu JSON z nazwami właściwości i wartościami odpowiadającymi twoim wymaganiom.

Możesz użyć funkcji czatu, takich jak polecenia ukośnika, odwołania do plików, metod lub klas i wątków, aby ustawić intencję i uzyskać lepsze odpowiedzi z kontekstem o określonym zakresie. W przypadku istniejącej klasy w projekcie otwartym w środowisku IDE możesz wyświetlić monit GitHub Copilot za pomocą polecenia /generate code to dserialize JSON to equivalent .NET object in #Filename.

W poniższych danych wyjściowych przedstawiono przykładową odpowiedź czatu copilot:

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.

Gdy copilot zwraca blok kodu, odpowiedź zawiera opcje kopiowania kodu, wstawiania kodu do nowego pliku lub podglądu danych wyjściowych kodu.

Uwaga

Wyniki mogą się różnić od przedstawionych w przykładowych odpowiedziach. Modele sztucznej inteligencji są niedeterministyczne, co oznacza, że mogą zwracać różne odpowiedzi po zadawaniu tego samego pytania. Może to być spowodowane dodatkowym uczeniem się i adaptacją w czasie, odmianą języka, zmianami w kontekście, takimi jak historia czatów i nie tylko.

Animowany zrzut ekranu przedstawiający korzystanie z funkcji Czat copilot w usłudze GitHub w programie Visual Studio w celu deserializacji ciągu JSON do obiektu platformy .NET.

Aby uzyskać więcej informacji, zobacz: