Támogatott gyűjteménytípusok a következő helyen: System.Text.Json
Ez a cikk áttekintést nyújt a szerializálás és a deszerializálás által támogatott gyűjteményekről. System.Text.Json.JsonSerializer a szerializáláshoz támogatja a gyűjteménytípust, ha:
- Származik vagy IEnumerableIAsyncEnumerable<T>
- Szerializálható elemeket tartalmaz.
A szerializáló meghívja a metódust GetEnumerator() , és megírja az elemeket.
A deszerializálás bonyolultabb, és egyes gyűjteménytípusok esetében nem támogatott.
A következő szakaszok névtér szerint vannak rendszerezve, és megjelenítik, hogy mely típusokat támogatja a szerializálás és a deszerializálás.
System.Array névtér
Típus | Szerializációs | Deszerializálás |
---|---|---|
Egydimenziós tömbök | ✔️ | ✔️ |
Többdimenziós tömbök | ❌ | ❌ |
Szaggatott tömbök | ✔️ | ✔️ |
System.Collections névtér
Típus | Szerializációs | Deszerializálás |
---|---|---|
ArrayList | ✔️ | ✔️ |
BitArray | ✔️ | ❌ |
DictionaryEntry | ✔️ | ✔️ |
Hashtable | ✔️ | ✔️ |
ICollection | ✔️ | ✔️ |
IDictionary | ✔️ | ✔️ |
IEnumerable | ✔️ | ✔️ |
IList | ✔️ | ✔️ |
Queue | ✔️ | ✔️ |
SortedList | ✔️ | ✔️ |
Stack * | ✔️ | ✔️ |
* A típusokkal kapcsolatban lásd a Támogatási körút című témakörtStack
.
System.Collections.Generic névtér
Típus | Szerializációs | Deszerializálás |
---|---|---|
Dictionary<TKey,TValue> * | ✔️ | ✔️ |
HashSet<T> | ✔️ | ✔️ |
IAsyncEnumerable<T> † | ✔️ | ✔️ |
ICollection<T> | ✔️ | ✔️ |
IDictionary<TKey,TValue> * | ✔️ | ✔️ |
IEnumerable<T> | ✔️ | ✔️ |
IList<T> | ✔️ | ✔️ |
IReadOnlyCollection<T> | ✔️ | ✔️ |
IReadOnlyDictionary<TKey,TValue> * | ✔️ | ✔️ |
IReadOnlyList<T> | ✔️ | ✔️ |
ISet<T> | ✔️ | ✔️ |
KeyValuePair<TKey,TValue> | ✔️ | ✔️ |
LinkedList<T> | ✔️ | ✔️ |
LinkedListNode<T> | ✔️ | ❌ |
List<T> | ✔️ | ✔️ |
Queue<T> | ✔️ | ✔️ |
SortedDictionary<TKey,TValue> * | ✔️ | ✔️ |
SortedList<TKey,TValue> * | ✔️ | ✔️ |
SortedSet<T> | ✔️ | ✔️ |
Stack<T> ‡ | ✔️ | ✔️ |
* Lásd a támogatott kulcstípusokat.
† Lásd a következő szakaszt.IAsyncEnumerable<T>
‡ A típusokkal kapcsolatban lásd a támogatási körutazástStack
.
IAsyncEnumerable<T>
Az alábbi példák streameket használnak az aszinkron adatforrások ábrázolásaként. A forrás lehet fájl egy helyi gépen, vagy egy adatbázis-lekérdezés vagy egy webszolgáltatás API-hívásának eredménye.
Stream szerializálása
System.Text.Json
támogatja az értékek JSON-tömbökként való szerializálását IAsyncEnumerable<T> , ahogyan az az alábbi példában is látható:
using System.Text.Json;
namespace IAsyncEnumerableSerialize;
public class Program
{
public static async Task Main()
{
using Stream stream = Console.OpenStandardOutput();
var data = new { Data = PrintNumbers(3) };
await JsonSerializer.SerializeAsync(stream, data);
}
static async IAsyncEnumerable<int> PrintNumbers(int n)
{
for (int i = 0; i < n; i++)
{
await Task.Delay(1000);
yield return i;
}
}
}
// output:
// {"Data":[0,1,2]}
IAsyncEnumerable<T>
az értékeket csak az aszinkron szerializálási módszerek támogatják, például JsonSerializer.SerializeAsync.
Stream deszerializálása
A DeserializeAsyncEnumerable
módszer támogatja a streamelt deszerializálást, ahogy az az alábbi példában is látható:
using System.Text;
using System.Text.Json;
namespace IAsyncEnumerableDeserialize;
public class Program
{
public static async Task Main()
{
using var stream = new MemoryStream(Encoding.UTF8.GetBytes("[0,1,2,3,4]"));
await foreach (int item in JsonSerializer.DeserializeAsyncEnumerable<int>(stream))
{
Console.WriteLine(item);
}
}
}
// output:
//0
//1
//2
//3
//4
A DeserializeAsyncEnumerable
metódus csak a gyökérszintű JSON-tömbökből való olvasást támogatja.
A DeserializeAsync metódus támogatja IAsyncEnumerable<T>
, de aláírása nem teszi lehetővé a streamelést. A végeredményt egyetlen értékként adja vissza, ahogy az az alábbi példában is látható.
using System.Text;
using System.Text.Json;
namespace IAsyncEnumerableDeserializeNonStreaming;
public class MyPoco
{
public IAsyncEnumerable<int>? Data { get; set; }
}
public class Program
{
public static async Task Main()
{
using var stream = new MemoryStream(Encoding.UTF8.GetBytes(@"{""Data"":[0,1,2,3,4]}"));
MyPoco? result = await JsonSerializer.DeserializeAsync<MyPoco>(stream)!;
await foreach (int item in result!.Data!)
{
Console.WriteLine(item);
}
}
}
// output:
//0
//1
//2
//3
//4
Ebben a példában a deszerializáló puffereli a memóriában lévő összes IAsyncEnumerable<T>
tartalmat, mielőtt visszaadja a deszerializált objektumot. Ez a viselkedés azért szükséges, mert a deszerializálónak az eredmény visszaadása előtt be kell olvasnia a teljes JSON hasznos adatot.
System.Collections.Nem módosítható névtér
Típus | Szerializációs | Deszerializálás |
---|---|---|
IImmutableDictionary<TKey,TValue> † | ✔️ | ✔️ |
IImmutableList<T> | ✔️ | ✔️ |
IImmutableQueue<T> | ✔️ | ✔️ |
IImmutableSet<T> | ✔️ | ✔️ |
IImmutableStack<T> * | ✔️ | ✔️ |
ImmutableArray<T> | ✔️ | ✔️ |
ImmutableDictionary<TKey,TValue> † | ✔️ | ✔️ |
ImmutableHashSet<T> | ✔️ | ✔️ |
ImmutableQueue<T> | ✔️ | ✔️ |
ImmutableSortedDictionary<TKey,TValue> † | ✔️ | ✔️ |
ImmutableSortedSet<T> | ✔️ | ✔️ |
ImmutableStack<T> * | ✔️ | ✔️ |
* A típusokkal kapcsolatban lásd a Támogatási körút című témakörtStack
.
† Lásd a támogatott kulcstípusokat.
System.Collections.Specializált névtér
Típus | Szerializációs | Deszerializálás |
---|---|---|
BitVector32 | ✔️ | ❌* |
HybridDictionary | ✔️ | ✔️ |
IOrderedDictionary | ✔️ | ❌ |
ListDictionary | ✔️ | ✔️ |
NameValueCollection | ✔️ | ❌ |
StringCollection | ✔️ | ❌ |
StringDictionary | ✔️ | ❌ |
* Ha BitVector32 deszerializálódik, a Data tulajdonság kimarad, mert nincs nyilvános beállítója. Nem képződik kivétel.
System.Collections.Concurrent névtér
Típus | Szerializációs | Deszerializálás |
---|---|---|
BlockingCollection<T> | ✔️ | ❌ |
ConcurrentBag<T> | ✔️ | ❌ |
ConcurrentDictionary<TKey,TValue> † | ✔️ | ✔️ |
ConcurrentQueue<T> | ✔️ | ✔️ |
ConcurrentStack<T> * | ✔️ | ✔️ |
* A típusokkal kapcsolatban lásd a Támogatási körút című témakörtStack
.
† Lásd a támogatott kulcstípusokat.
System.Collections.ObjectModel névtér
Típus | Szerializációs | Deszerializálás |
---|---|---|
Collection<T> | ✔️ | ✔️ |
KeyedCollection sztring<, TValue> * | ✔️ | ❌ |
ObservableCollection<T> | ✔️ | ✔️ |
ReadOnlyCollection<T> | ✔️ | ❌ |
ReadOnlyDictionary<TKey,TValue> | ✔️ | ❌ |
ReadOnlyObservableCollection<T> | ✔️ | ❌ |
* A nem kulcsokstring
nem támogatottak.
Egyéni gyűjtemények
Minden olyan gyűjteménytípus, amely nem szerepel az előző névterek egyikében, egyéni gyűjteménynek minősül. Az ilyen típusok közé tartoznak a ASP.NET Core által definiált, felhasználó által definiált típusok. Például Microsoft.Extensions.Primitives ebben a csoportban van.
Minden egyéni gyűjtemény (minden, amelyből IEnumerable
származik) támogatott a szerializálás, mindaddig, amíg az elemtípusok támogatottak.
Egyéni gyűjtemények deszerializálási támogatással
Az egyéni gyűjtemények akkor támogatottak a deszerializáláshoz, ha:
Ez nem felület vagy absztrakt.
Paraméter nélküli konstruktorsal rendelkezik.
Azokat az elemtípusokat tartalmazza, amelyeket a JsonSerializerprogram támogat.
Implementálja vagy örökli az alábbi felületek vagy osztályok egy vagy többét:
- ConcurrentQueue<T>
- ConcurrentStack<T> *
- ICollection<T>
- IDictionary
- IDictionary<TKey,TValue> †
- IList
- IList<T>
- Queue
- Queue<T>
- Stack *
- Stack<T> *
* A típusokkal kapcsolatban lásd a Támogatási körút című témakört
Stack
.† Lásd a támogatott kulcstípusokat.
Ismert problémákkal rendelkező egyéni gyűjtemények
Az alábbi egyéni gyűjteményekkel kapcsolatban ismert problémák lépnek fel:
- ExpandoObject: Lásd: dotnet/runtime#29690.
- DynamicObject: Lásd: dotnet/runtime#1808.
- DataTable: Lásd: dotnet/docs#21366.
- Microsoft.AspNetCore.Http.FormFile: Lásd: dotnet/runtime#1559.
- Microsoft.AspNetCore.Http.IFormCollection: Lásd: dotnet/runtime#1559.
Az ismert problémákról további információt a nyitott problémákat ismertető cikkben System.Text.Jsontalál.
Támogatott kulcstípusok
A kulcsok Dictionary
és SortedList
típusok támogatott típusai a következők:
Boolean
Byte
DateTime
DateTimeOffset
Decimal
Double
Enum
Guid
Int16
Int32
Int64
Object
(Csak szerializáláskor, és ha a futtatókörnyezet típusa a lista egyik támogatott típusa.)SByte
Single
String
UInt16
UInt32
UInt64
System.Data névtér
A névtérben nincsenek beépített konverterek a , DataTableés a System.Data kapcsolódó típusok számáraDataSet. Az ilyen típusú adatok nem megbízható bemenetektől való deszerializálása nem biztonságos, ahogyan azt a biztonsági útmutató ismerteti. Azonban egyéni konvertert is írhat, hogy támogassa ezeket a típusokat. A szerializálni és deszerializálni DataTable
kívánt egyéni átalakítókód mintáját lásd: RoundtripDataTable.cs.
Kapcsolódó információk
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: