Share via


JSON lezen als .NET-objecten (deserialiseren)

In dit artikel wordt beschreven hoe u de System.Text.Json naamruimte gebruikt om deserialiseren vanuit JavaScript Object Notation (JSON) te deserialiseren. Als u bestaande code Newtonsoft.Jsonovergezet hebt, raadpleegt u Migreren naar System.Text.Json.

Een veelgebruikte manier om JSON te deserialiseren is door een .NET-klasse te hebben (of te maken) met eigenschappen en velden die een of meer JSON-eigenschappen vertegenwoordigen. Roep vervolgens de JsonSerializer.Deserialize methode aan om deserialiseren vanuit een tekenreeks of een bestand. Voor de algemene overbelastingen is de algemene typeparameter de .NET-klasse. Voor niet-algemene overbelastingen geeft u het type van de klasse door als methodeparameter. U kunt synchroon of asynchroon deserialiseren.

Tip

U kunt AI-hulp gebruiken om een JSON-tekenreeks te deserialiseren met GitHub Copilot.

JSON-eigenschappen die niet in uw klasse worden weergegeven, worden standaard genegeerd. Als eigenschappen van het type vereist zijn, maar niet aanwezig zijn in de JSON-nettolading, mislukt deserialisatie.

Voorbeelden

In het volgende voorbeeld ziet u hoe u een JSON-tekenreeks deserialiseert:

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)

Als u een bestand wilt deserialiseren met behulp van synchrone code, leest u het bestand in een tekenreeks, zoals wordt weergegeven in het volgende voorbeeld:

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)

Als u wilt deserialiseren vanuit een bestand met behulp van asynchrone code, roept u de DeserializeAsync methode aan:

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)

Gedrag van deserialisatie

Het volgende gedrag is van toepassing bij het deserialiseren van JSON:

  • Standaard is eigenschapsnaamkoppeling hoofdlettergevoelig. U kunt hoofdlettergevoeligheid opgeven.
  • Niet-openbare constructors worden genegeerd door de serialisatiefunctie.
  • Deserialisatie voor onveranderbare objecten of eigenschappen die geen openbare set toegangsrechten hebben, wordt ondersteund, maar niet standaard ingeschakeld. Zie Onveranderbare typen en records.
  • Opsommingen worden standaard ondersteund als getallen. U kunt tekenreeksvelden deserialiseren.
  • Standaard worden velden genegeerd. U kunt velden opnemen.
  • Standaard worden opmerkingen of volgkomma's in de JSON-werpuitzonderingen weergegeven. U kunt opmerkingen en volgkomma's toestaan.
  • De standaard maximale diepte is 64.

Wanneer u indirect in een ASP.NET Core-app gebruikt System.Text.Json , zijn sommige standaardgedragen anders. Zie Webstandaarden voor JsonSerializerOptions voor meer informatie.

U kunt aangepaste conversieprogramma's implementeren om functionaliteit te bieden die niet wordt ondersteund door de ingebouwde conversieprogramma's.

Deserialiseren zonder .NET-klasse

Als u JSON hebt die u wilt deserialiseren en u niet over de klasse beschikt om deze in te deserialiseren, hebt u andere opties dan het handmatig maken van de klasse die u nodig hebt:

  • Gebruik de Utf8JsonReader rechtstreeks.

  • Deserialiseer in een JSON DOM (documentobjectmodel) en pak wat u nodig hebt uit de DOM.

    Met de DOM kunt u naar een subsectie van een JSON-nettolading navigeren en één waarde, een aangepast type of een matrix deserialiseren. Zie Subsecties van een JSON-nettolading deserialiseren voor informatie over de JsonNode DOM. Zie Een JsonDocument en JsonElement doorzoeken voor subelementen voor informatie over de JsonDocument DOM.

  • Gebruik Visual Studio 2022 om automatisch de klasse te genereren die u nodig hebt:

    • Kopieer de JSON die u moet deserialiseren.
    • Maak een klassebestand en verwijder de sjablooncode.
    • Kies Plakken speciaal>plakken van JSON bewerken als klassen.>

    Het resultaat is een klasse die u kunt gebruiken voor uw deserialisatiedoel.

Deserialiseren van UTF-8

Als u wilt deserialiseren vanuit UTF-8, roept u een JsonSerializer.Deserialize overbelasting aan die een ReadOnlySpan<byte> of meer Utf8JsonReadergebruikt, zoals wordt weergegeven in de volgende voorbeelden. In de voorbeelden wordt ervan uitgegaan dat de JSON zich in een bytematrix bevindt met de naam 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

GitHub Copilot gebruiken om JSON te deserialiseren

U kunt GitHub Copilot in uw IDE gebruiken om code te genereren die wordt gebruikt System.Text.Json voor het deserialiseren van JSON.

Als u Visual Studio 2022 versie 17.8 of hoger gebruikt, kunt u de AI-gestuurde GitHub Copilot in Visual Studio proberen om code te genereren die wordt gebruikt System.Text.Json om JSON te deserialiseren. Dien uw vraag in als prompt in het Copilot-chatvenster, zoals in het volgende voorbeeld. U kunt ook prompts verzenden via inlinechat in het editorvenster zelf.

Notitie

GitHub Copilot wordt mogelijk gemaakt door AI, dus verrassingen en fouten zijn mogelijk. Zorg ervoor dat u alle gegenereerde code of suggesties controleert. Zie de veelgestelde vragen over GitHub Copilot voor meer informatie over het algemene gebruik van GitHub Copilot, productimpact, menselijk toezicht en privacy.

In de volgende tekst ziet u een voorbeeldprompt voor Copilot Chat:

Genereer code om System.Text.Json een JSON-tekenreeks {"FirstName":"John","LastName":"Doe","Age":30} te deserialiseren naar een equivalent .NET-object. Eigenschapsnamen en -waarden toewijzen. Geef voorbeelduitvoer op.

U kunt de prompt aanpassen om een JSON-tekenreeks te gebruiken met eigenschapsnamen en -waarden die aan uw vereisten voldoen.

U kunt chatfuncties, zoals slash-opdrachten, verwijzingen naar bestanden, methoden of klassen en threads, gebruiken om intenties in te stellen en betere antwoorden te krijgen met contextbereik. Voor een bestaande klasse in een project dat is geopend in de IDE, kunt u GitHub Copilot vragen met /generate code to dserialize JSON to equivalent .NET object in #Filename.

In de volgende uitvoer ziet u een voorbeeld van een Copilot Chat-antwoord:

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.

Wanneer Copilot een codeblok retourneert, bevat het antwoord opties voor het kopiëren van de code, het invoegen van de code in een nieuw bestand of het bekijken van de code-uitvoer.

Notitie

Uw resultaten kunnen afwijken van wat wordt weergegeven in de voorbeeldantwoorden. AI-modellen zijn niet-deterministisch, wat betekent dat ze verschillende antwoorden kunnen retourneren wanneer ze dezelfde vraag stellen. Dit kan worden veroorzaakt door extra leer- en aanpassing in de loop van de tijd, taalvariatie, wijzigingen in context, zoals uw chatgeschiedenis en meer.

Schermafbeelding met animatie die laat zien hoe u GitHub Copilot Chat in Visual Studio gebruikt om een JSON-tekenreeks te deserialiseren naar een .NET-object.

Zie voor meer informatie: