Megosztás a következőn keresztül:


JSON olvasása .NET-objektumokként (deszerializálás)

Ez a cikk bemutatja, hogyan szerializálhatja és deszerializálhatja a System.Text.Json névteret a JavaScript Object Notation (JSON) használatával. Ha meglévő kódot Newtonsoft.Jsonportoz, olvassa el a Migrálás a következőre című témakörtSystem.Text.Json.

A JSON deszerializálásának gyakori módja egy .NET-osztály létrehozása (vagy létrehozása) olyan tulajdonságokkal és mezőkkel, amelyek egy vagy több JSON-tulajdonságot jelölnek. Ezután sztringből vagy fájlból való deszerializáláshoz hívja meg a metódust JsonSerializer.Deserialize . Az általános túlterhelések esetében az általános típusparaméter a .NET-osztály. A nem általános túlterhelések esetén az osztály típusát metódusparaméterként adja át. Deszerializálhatja szinkron vagy aszinkron módon.

Az osztályban nem szereplő JSON-tulajdonságok alapértelmezés szerint figyelmen kívül lesznek hagyva. Ha a típushoz tartozó tulajdonságokra szükség van, de nem szerepel a JSON hasznos adatai között, a deszerializálás sikertelen lesz.

Az alábbi példa bemutatja, hogyan lehet deszerializálni egy JSON-sztringet:

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)

Ha szinkronizált kóddal szeretne deszerializálni egy fájlt, olvassa be a fájlt egy sztringbe, ahogyan az a következő példában látható:

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)

Ha aszinkron kóddal szeretne deszerializálni egy fájlt, hívja meg a következő metódust 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)

Deszerializálási viselkedés

A JSON deszerializálásakor a következő viselkedések érvényesek:

Ha közvetetten használ System.Text.Json egy ASP.NET Core-alkalmazásban, bizonyos alapértelmezett viselkedések eltérőek. További információ: A JsonSerializerOptions webes alapértelmezései.

Egyéni konvertereket is implementálhat, hogy olyan funkciókat biztosítson, amelyeket a beépített konverterek nem támogatnak.

Deszerializálás .NET-osztály nélkül

Ha jSON-t szeretne deszerializálni, és nem rendelkezik azzal az osztálysal, amelybe deszerializálni szeretné azt, a szükséges osztály manuális létrehozásán kívül más lehetőségek is rendelkezésre állnak:

  • Használja közvetlenül az Utf8JsonReadert .

  • Deszerializáljon egy JSON DOM-et (dokumentumobjektum-modell), és kinyerje a szükséges adatokat a DOM-ból.

    A DOM segítségével navigálhat egy JSON-hasznos adat alszakaszához, és deszerializálhat egyetlen értéket, egyéni típust vagy tömböt. A DOM-ról további információt a JsonNode JSON hasznos adat alszakaszainak deszerializálása című témakörben talál. A DOM-ról további információt a JsonDocument JsonDocument és a JsonElement alelemek keresése című témakörben talál.

  • A Visual Studio 2022 használatával automatikusan létrehozhatja a szükséges osztályt:

    • Másolja ki a deszerializáláshoz szükséges JSON-t.
    • Hozzon létre egy osztályfájlt, és törölje a sablonkódot.
    • Válassza a Speciális>beillesztési JSON beillesztésének szerkesztése>osztályként lehetőséget.

    Az eredmény egy osztály, amelyet a deszerializálási célhoz használhat.

Deszerializálás az UTF-8-ról

Az UTF-8-ról való deszerializáláshoz hívjon túlterhelést JsonSerializer.DeserializeReadOnlySpan<byte> , amely egy vagy egy Utf8JsonReader, az alábbi példákban látható módon. A példák feltételezik, hogy a JSON egy jsonUtf8Bytes nevű bájttömbben található.

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