Lesen von JSON als .NET-Objekte (Deserialisieren)
Dieser Artikel veranschaulicht, wie Sie mithilfe des System.Text.Json-Namespace Daten aus dem JSON-Format (JavaScript Object Notation) deserialisieren. Wenn Sie vorhandenen Code aus Newtonsoft.Json
portieren, finden Sie weitere Informationen unter Migrieren zu System.Text.Json
.
Eine gängige Methode zum Deserialisieren von JSON-Code besteht darin, eine -NET-Klasse mit Eigenschaften und Feldern zu haben (oder zu erstellen), die mindestens eine der JSON-Eigenschaften darstellen. Um aus einer Zeichenfolge oder einer Datei zu deserialisieren, rufen Sie dann die JsonSerializer.Deserialize-Methode auf. Für die generischen Überladungen ist der generische Typparameter die .NET-Klasse. Für die nicht generischen Überladungen übergeben Sie den Klassentyp als Methodenparameter. Die Deserialisierung kann synchron oder asynchron erfolgen.
Tipp
Sie können KI-Unterstützung verwenden, um mit GitHub Copilot eine JSON-Zeichenfolge zu deserialisieren.
Alle JSON-Eigenschaften, die nicht in Ihrer Klasse dargestellt werden, werden standardmäßig ignoriert. Wenn Eigenschaften des Typs erforderlich, in den JSON-Nutzdaten jedoch nicht vorhanden sind, schlägt die Deserialisierung fehl.
Beispiele
Im folgenden Beispiel wird gezeigt, wie eine JSON-Zeichenfolge deserialisiert wird:
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)
Um mithilfe von synchronem Code aus einer Datei zu deserialisieren, lesen Sie die Datei in eine Zeichenfolge, wie im folgenden Beispiel gezeigt:
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)
Um mithilfe von asynchronem Code aus einer Datei zu deserialisieren, rufen Sie die DeserializeAsync-Methode auf:
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)
Deserialisierungsverhalten
Beim Deserialisieren von JSON-Code gelten die folgenden Verhaltensweisen:
- Beim Abgleichen der Eigenschaftsnamen wird standardmäßig die Groß-/Kleinschreibung beachtet. Sie können angeben, dass Groß-/Kleinschreibung nicht berücksichtigt wird.
- Nicht öffentliche Konstruktoren werden vom Serialisierungsmodul ignoriert.
- Die Deserialisierung in unveränderliche Objekte oder Eigenschaften ohne öffentliche
set
-Zugriffsmethoden wird unterstützt, ist aber nicht standardmäßig aktiviert. Weitere Informationen finden Sie unter Unveränderliche Typen und Datensätze. - Standardmäßig werden Enumerationen (Aufzählungen) als Zahlen unterstützt. Sie können Zeichenfolgen-Enumerationsfelder deserialisieren.
- Felder werden standardmäßig ignoriert. Sie können Felder einschließen.
- Standardmäßig lösen Kommentare oder nachfolgende Kommas im JSON-Code Ausnahmen aus. Sie können Kommentare und nachfolgende Kommas zulassen.
- Die standardmäßige maximale Tiefe beträgt 64.
Wenn Sie System.Text.Json indirekt in einer ASP.NET Core-App verwenden, unterscheiden sich einige Standardverhaltensweisen. Weitere Informationen finden Sie unter Webstandardwerte für JsonSerializerOptions.
Sie können benutzerdefinierte Konverter implementieren, um Funktionen bereitzustellen, die von den integrierten Konvertern nicht unterstützt werden.
Deserialisieren ohne .NET-Klasse
Wenn Sie JSON-Code deserialisieren möchten und keine Klasse haben, in die der Code deserialisiert werden soll, haben Sie auch andere Optionen als die benötigten Klasse manuell zu erstellen:
Verwenden Sie Utf8JsonReader direkt.
Deserialisieren Sie in ein JSON-DOM (Dokumentobjektmodell), und extrahieren Sie die benötigten Elemente aus dem DOM.
Mit dem DOM können Sie zu einem Unterabschnitt von JSON-Nutzdaten navigieren und einen einzelnen Wert, einen benutzerdefinierten Typ oder ein Array deserialisieren. Informationen zum JsonNode-DOM in finden Sie unter Deserialisieren der Unterabschnitte von JSON-Nutzdaten. Informationen zum JsonDocument-DOM finden Sie unter Durchsuchen von „JsonDocument“ und „JsonElement“ nach Unterelementen.
Generieren Sie die benötigte Klasse automatisch mit Visual Studio 2022:
- Kopieren Sie den JSON-Code, den Sie deserialisieren müssen.
- Erstellen Sie eine Klassendatei, und löschen Sie den Vorlagencode.
- Verwenden Sie die Optionen Bearbeiten>Inhalte einfügen>JSON als Klassen einfügen.
Das Ergebnis ist eine Klasse, die Sie als Deserialisierungsziel verwenden können.
Deserialisieren aus UTF-8
Um aus UTF-8 zu deserialisieren, rufen Sie eine JsonSerializer.Deserialize-Überladung auf, die einen ReadOnlySpan<byte>
oder ein Utf8JsonReader
akzeptiert, wie in den folgenden Beispielen gezeigt. In den Beispielen wird vorausgesetzt, dass sich das JSON in einem Bytearray namens „jsonUtf8Bytes“ befindet.
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
Verwenden von GitHub Copilot zum Deserialisieren von JSON
Sie können GitHub Copilot in Ihrer IDE verwenden, um Code zu generieren, der System.Text.Json
verwendet, von JSON zu deserialisieren.
Wenn Sie Visual Studio 2022, Version 17.8 oder höher verwenden, können Sie GitHub Copilot in Visual Studio mit KI-Unterstützung ausprobieren, um Code zu generieren, der für die Deserialisierung von JSON System.Text.Json
verwendet. Reichen Sie im Chat-Fenster von Copilot Ihre Frage als Eingabeaufforderung ein. Sehen Sie sich hierzu das folgende Beispiel an. Sie können Eingabeaufforderungen auch über den Inline-Chat im Editorfenster senden.
Hinweis
GitHub Copilot wird von KI unterstützt. Daher sind Überraschungen und Fehler möglich. Überprüfen Sie jeden generierten Code oder alle Vorschläge. Weitere Informationen zur allgemeinen Verwendung von GitHub Copilot, zu den Auswirkungen des Produkts, zur menschlichen Aufsicht und zum Datenschutz finden Sie unter Häufig gestellte Fragen zu GitHub Copilot.
Der folgende Text zeigt eine Beispielaufforderung für Copilot Chat:
Generieren Sie Code zur Verwendung von
System.Text.Json
zum Deserialisieren einer JSON-Zeichenfolge {„FirstName“:„John֧,„LastName“:„Doe“,„Age“:30} zu einem äquivalenten .NET-Objekt. Zuordnen von Eigenschaftsnamen & -werten. Ein Beispiel für eine Ausgabe bereitstellen.
Sie können die Eingabeaufforderung so anpassen, dass sie eine JSON-Zeichenfolge mit Eigenschaftsnamen und -werten verwendet, die Ihren Anforderungen entsprechen.
Sie können Chat-Funktionen wie Slash-Befehle, Verweise auf Dateien, Methoden oder Klassen sowie Threads verwenden, um eine Absicht festzulegen und bessere Antworten mit bereichsbezogenem Kontext zu erhalten. Für eine Klasse, die in einem in der IDE geöffneten Projekt vorhanden ist, können Sie an GitHub Copilot die Aufforderung /generate code to dserialize JSON to equivalent .NET object in #Filename
senden.
Die folgende Ausgabe zeigt ein Beispiel für eine Copilot Chat-Antwort:
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.
Wenn Copilot einen Codeblock zurückgibt, dann werden in der Antwort Optionen zum Kopieren des Codes, zum Einfügen des Codes in eine neue Datei oder zum Anzeigen einer Vorschau des Codes aufgelistet.
Hinweis
Die Ergebnisse können möglicherweise von den in diesen Beispielantworten gezeigten Ergebnissen abweichen. KI-Modelle sind nicht deterministisch. Das bedeutet, dass sie auf die gleiche Frage verschiedene Antworten zurückgeben können. Dies kann auf zusätzliche Lernaktivitäten und Anpassung im Laufe der Zeit, Sprachvariation, Änderungen im Kontext, wie z. B. Ihren Chatverlauf und viele weiter Faktoren zurückzuführen sein.
Weitere Informationen finden Sie unter:
- GitHub Copilot Trust Center
- GitHub Copilot in Visual Studio
- GitHub Copilot in VS Code