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 serializacji do i 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.

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