Jak číst JSON jako objekty .NET (deserializovat)
Tento článek ukazuje, jak použít System.Text.Json obor názvů k deserializaci z javascriptového objektového zápisu (JSON). Pokud portujete existující kód z Newtonsoft.Json
, přečtěte si, jak migrovat na System.Text.Json
.
Běžným způsobem, jak deserializovat JSON, je mít (nebo vytvořit) třídu .NET s vlastnostmi a poli, které představují jednu nebo více vlastností JSON. Potom, chcete-li deserializovat z řetězce nebo souboru, zavolejte metodu JsonSerializer.Deserialize . Pro obecná přetížení je parametr obecného typu třída .NET. Pro negenerické přetížení předáte typ třídy jako parametr metody. Synchronně nebo asynchronně můžete deserializovat.
Tip
Pomoc s AI můžete použít k deserializaci řetězce JSON pomocí GitHub Copilotu.
Všechny vlastnosti JSON, které nejsou ve vaší třídě reprezentované, se ve výchozím nastavení ignorují. Pokud jsou v datové části JSON požadovány nějaké vlastnosti typu, ale nejsou k dispozici, deserializace selže.
Příklady
Následující příklad ukazuje, jak deserializovat řetězec 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)
Pokud chcete deserializovat ze souboru pomocí synchronního kódu, načtěte soubor do řetězce, jak je znázorněno v následujícím příkladu:
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)
Pokud chcete deserializovat ze souboru pomocí asynchronního kódu, zavolejte metodu 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)
Chování deserializace
Při deserializaci JSON platí následující chování:
- Ve výchozím nastavení se u názvu vlastnosti rozlišují malá a velká písmena. Můžete určit rozlišování velkých a malých písmen.
- Nepřístupné konstruktory jsou serializátorem ignorovány.
- Deserializace na neměnné objekty nebo vlastnosti, které nemají veřejné
set
přístupové objekty, je podporována, ale ve výchozím nastavení není povolená. Viz neměnné typy a záznamy. - Ve výchozím nastavení jsou výčty podporovány jako čísla. Pole výčtu řetězců můžete deserializovat.
- Ve výchozím nastavení se pole ignorují. Můžete zahrnout pole.
- Ve výchozím nastavení vyvolá komentáře nebo koncové čárky ve formátu JSON výjimky. Můžete povolit komentáře a koncové čárky.
- Výchozí maximální hloubka je 64.
Když v aplikaci ASP.NET Core použijete System.Text.Json nepřímo, liší se některé výchozí chování. Další informace najdete v tématu Výchozí nastavení webu pro JsonSerializerOptions.
Můžete implementovat vlastní převaděče , které poskytují funkce, které nejsou podporovány integrovanými převaděči.
Deserializace bez třídy .NET
Pokud máte JSON, který chcete deserializovat a nemáte třídu k deserializaci, máte jiné možnosti než ruční vytvoření třídy, kterou potřebujete:
Deserializace do modelu JSON DOM (objektový model dokumentu) a extrakce toho, co potřebujete, z modelu DOM.
DoM umožňuje přejít do pododdílu datové části JSON a deserializovat jednu hodnotu, vlastní typ nebo pole. Informace o objektu JsonNode DOM najdete v tématu Deserializace pododdílů datové části JSON. Informace o objektu JsonDocument DOM najdete v tématu Jak vyhledat dílčí elementy JsonDocument a JsonElement.
Pomocí sady Visual Studio 2022 můžete automaticky vygenerovat požadovanou třídu:
- Zkopírujte JSON, který potřebujete deserializovat.
- Vytvořte soubor třídy a odstraňte kód šablony.
- Zvolte Upravit>vložit speciální>vložit JSON jako třídy.
Výsledkem je třída, kterou můžete použít pro cíl deserializace.
Deserializace z UTF-8
Chcete-li deserializovat z UTF-8, zavolejte JsonSerializer.Deserialize přetížení, které přebírá ReadOnlySpan<byte>
nebo , Utf8JsonReader
jak je znázorněno v následujících příkladech. Příklady předpokládají, že JSON je v bajtovém poli s názvem 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
Použití GitHub Copilotu k deserializaci JSON
Pomocí GitHub Copilotu v integrovaném vývojovém prostředí (IDE) můžete vygenerovat kód, který se používá System.Text.Json
k deserializaci z JSON.
Pokud používáte Visual Studio 2022 verze 17.8 nebo novější, můžete vyzkoušet GitHub Copilot řízený pomocí AI v sadě Visual Studio a vygenerovat kód, který se používá System.Text.Json
k deserializaci JSON. Odešlete otázku jako výzvu v okně chatu Copilot, jak je znázorněno v následujícím příkladu. Můžete také odesílat výzvy pomocí vloženého chatu v samotném okně editoru.
Poznámka:
GitHub Copilot využívá technologii AI, takže jsou možná překvapení a chyby. Nezapomeňte ověřit vygenerovaný kód nebo návrhy. Další informace o obecném použití GitHub Copilotu, dopadu produktu, lidského dohledu a ochrany osobních údajů najdete v nejčastějších dotazech ke Kopírování GitHubu.
Následující text ukazuje příklad výzvy ke kopírování chatu:
Vygenerujte kód pro
System.Text.Json
deserializaci řetězce JSON {"FirstName":"John","LastName":"Doe","Age":30} na ekvivalentní objekt .NET. Mapovat názvy a hodnoty vlastností Zadejte příklad výstupu.
Tuto výzvu můžete přizpůsobit tak, aby používala řetězec JSON s názvy vlastností a hodnotami, které vyhovují vašim požadavkům.
Pomocí funkcí chatu, jako jsou příkazy lomítka, odkazy na soubory, metody nebo třídy a vlákna, můžete nastavit záměr a získat lepší odpovědi s vymezeným kontextem. Pro existující třídu v projektu, který je otevřen v integrovaném vývojovém prostředí, můžete vyzvat GitHub Copilot s /generate code to dserialize JSON to equivalent .NET object in #Filename
.
Následující výstup ukazuje příklad odpovědi copilot chatu:
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.
Když Copilot vrátí blok kódu, odpověď obsahuje možnosti pro zkopírování kódu, vložení kódu do nového souboru nebo náhled výstupu kódu.
Poznámka:
Výsledky se můžou lišit od toho, co se zobrazuje v ukázkových odpovědích. Modely AI nejsou deterministické, což znamená, že při kladení stejné otázky můžou vrátit různé odpovědi. Důvodem může být další učení a přizpůsobení v průběhu času, jazykové variace, změny v kontextu, například historie chatu a další.
Další informace naleznete v tématu: