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.Json
portoz, 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:
- A tulajdonságnév-egyeztetés alapértelmezés szerint megkülönbözteti a kis- és nagybetűk megkülönböztetettségét. Megadhatja a kis- és nagybetűk érzéketlenségét.
- A szerializáló figyelmen kívül hagyja a nem nyilvános konstruktorokat.
- Az olyan nem módosítható objektumokra vagy tulajdonságokra való deszerializálás, amelyek nem rendelkeznek nyilvános
set
tartozékokkal, alapértelmezés szerint támogatottak, de nem engedélyezettek. Lásd: Nem módosítható típusok és rekordok. - Alapértelmezés szerint az enumerálások számként támogatottak. Sztringek számmezőit deszerializálhatja.
- Alapértelmezés szerint a mezők figyelmen kívül lesznek hagyva. Mezőket is felvehet.
- Alapértelmezés szerint a JSON-ban lévő megjegyzések vagy záró vesszők kivételeket vetnek ki. Engedélyezheti a megjegyzéseket és a záró vesszőket.
- Az alapértelmezett maximális mélység 64.
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
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: