Ondersteunde verzamelingstypen in System.Text.Json
Dit artikel bevat een overzicht van welke verzamelingen worden ondersteund voor serialisatie en deserialisatie. System.Text.Json.JsonSerializer ondersteunt een verzamelingstype voor serialisatie als dit het volgende doet:
- Afgeleid van IEnumerable of IAsyncEnumerable<T>
- Bevat elementen die serialiseerbaar zijn.
De serializer roept de methode aan GetEnumerator() en schrijft de elementen.
Deserialisatie is ingewikkelder en wordt niet ondersteund voor sommige verzamelingstypen.
De volgende secties zijn ingedeeld op naamruimte en laten zien welke typen worden ondersteund voor serialisatie en deserialisatie.
System.Array-naamruimte
Type | Serialization | Deserialisatie |
---|---|---|
Eendimensionale matrices | ✔️ | ✔️ |
Multidimensionale matrices | ❌ | ❌ |
Gelabelde matrices | ✔️ | ✔️ |
System.Collections-naamruimte
Type | Serialization | Deserialisatie |
---|---|---|
ArrayList | ✔️ | ✔️ |
BitArray | ✔️ | ❌ |
DictionaryEntry | ✔️ | ✔️ |
Hashtable | ✔️ | ✔️ |
ICollection | ✔️ | ✔️ |
IDictionary | ✔️ | ✔️ |
IEnumerable | ✔️ | ✔️ |
IList | ✔️ | ✔️ |
Queue | ✔️ | ✔️ |
SortedList | ✔️ | ✔️ |
Stack * | ✔️ | ✔️ |
* Zie Ondersteuningsrondje voor Stack
typen.
System.Collections.Generic-naamruimte
Type | Serialization | Deserialisatie |
---|---|---|
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> ‡ | ✔️ | ✔️ |
* Zie Ondersteunde sleuteltypen.
† Zie de volgende sectie over IAsyncEnumerable<T>
.
‡ Zie ondersteuningsrondje voor Stack
typen.
IAsyncEnumerable<T>
In de volgende voorbeelden worden streams gebruikt als een weergave van een asynchrone gegevensbron. De bron kan bestanden op een lokale computer zijn, of resultaten van een databasequery of webservice-API-aanroep.
Stream-serialisatie
System.Text.Json
ondersteunt het serialiseren van IAsyncEnumerable<T> waarden als JSON-matrices, zoals wordt weergegeven in het volgende voorbeeld:
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>
waarden worden alleen ondersteund door de asynchrone serialisatiemethoden, zoals JsonSerializer.SerializeAsync.
Stroomdeserialisatie
De DeserializeAsyncEnumerable
methode ondersteunt streamingdeserialisatie, zoals wordt weergegeven in het volgende voorbeeld:
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
De DeserializeAsyncEnumerable
methode biedt alleen ondersteuning voor het lezen van JSON-matrices op hoofdniveau.
De DeserializeAsync methode ondersteunt IAsyncEnumerable<T>
, maar de handtekening staat streaming niet toe. Het uiteindelijke resultaat wordt als één waarde geretourneerd, zoals wordt weergegeven in het volgende voorbeeld.
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
In dit voorbeeld buffert deserializer alle IAsyncEnumerable<T>
inhoud in het geheugen voordat het gedeserialiseerde object wordt geretourneerd. Dit gedrag is nodig omdat de deserializer de volledige JSON-nettolading moet lezen voordat een resultaat wordt geretourneerd.
System.Collections.Immutable naamruimte
Type | Serialization | Deserialisatie |
---|---|---|
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> * | ✔️ | ✔️ |
* Zie Ondersteuningsrondje voor Stack
typen.
† Ondersteunde sleuteltypen weergeven.
System.Collections.Specialized-naamruimte
Type | Serialization | Deserialisatie |
---|---|---|
BitVector32 | ✔️ | ❌* |
HybridDictionary | ✔️ | ✔️ |
IOrderedDictionary | ✔️ | ❌ |
ListDictionary | ✔️ | ✔️ |
NameValueCollection | ✔️ | ❌ |
StringCollection | ✔️ | ❌ |
StringDictionary | ✔️ | ❌ |
* Wanneer BitVector32 wordt gedeserialiseerd, wordt de Data eigenschap overgeslagen omdat deze geen openbare setter heeft. Er wordt geen uitzondering geretourneerd.
System.Collections.Concurrent-naamruimte
Type | Serialization | Deserialisatie |
---|---|---|
BlockingCollection<T> | ✔️ | ❌ |
ConcurrentBag<T> | ✔️ | ❌ |
ConcurrentDictionary<TKey,TValue> † | ✔️ | ✔️ |
ConcurrentQueue<T> | ✔️ | ✔️ |
ConcurrentStack<T> * | ✔️ | ✔️ |
* Zie Ondersteuningsrondje voor Stack
typen.
† Ondersteunde sleuteltypen weergeven.
System.Collections.ObjectModel-naamruimte
Type | Serialization | Deserialisatie |
---|---|---|
Collection<T> | ✔️ | ✔️ |
KeyedCollection-tekenreeks<, TValue> * | ✔️ | ❌ |
ObservableCollection<T> | ✔️ | ✔️ |
ReadOnlyCollection<T> | ✔️ | ❌ |
ReadOnlyDictionary<TKey,TValue> | ✔️ | ❌ |
ReadOnlyObservableCollection<T> | ✔️ | ❌ |
* Niet-sleutelsstring
worden niet ondersteund.
Aangepaste verzamelingen
Een verzamelingstype dat zich niet in een van de voorgaande naamruimten bevindt, wordt beschouwd als een aangepaste verzameling. Dergelijke typen omvatten door de gebruiker gedefinieerde typen en typen die zijn gedefinieerd door ASP.NET Core. Bevindt zich bijvoorbeeld Microsoft.Extensions.Primitives in deze groep.
Alle aangepaste verzamelingen (alles wat is afgeleid van IEnumerable
) worden ondersteund voor serialisatie, zolang hun elementtypen worden ondersteund.
Aangepaste verzamelingen met ondersteuning voor deserialisatie
Een aangepaste verzameling wordt ondersteund voor deserialisatie als deze:
Is geen interface of abstract.
Heeft een parameterloze constructor.
Bevat elementtypen die worden ondersteund door JsonSerializer.
Implementeert of neemt een of meer van de volgende interfaces of klassen over:
- ConcurrentQueue<T>
- ConcurrentStack<T> *
- ICollection<T>
- IDictionary
- IDictionary<TKey,TValue> †
- IList
- IList<T>
- Queue
- Queue<T>
- Stack *
- Stack<T> *
* Zie Ondersteuningsrondje voor
Stack
typen.† Ondersteunde sleuteltypen weergeven.
Aangepaste verzamelingen met bekende problemen
Er zijn bekende problemen met de volgende aangepaste verzamelingen:
- ExpandoObject: Zie dotnet/runtime#29690.
- DynamicObject: Zie dotnet/runtime#1808.
- DataTable: Zie dotnet/docs#21366.
- Microsoft.AspNetCore.Http.FormFile: Zie dotnet/runtime#1559.
- Microsoft.AspNetCore.Http.IFormCollection: Zie dotnet/runtime#1559.
Zie de openstaande problemen in System.Text.Jsonvoor meer informatie over bekende problemen.
Ondersteunde sleuteltypen
Ondersteunde typen voor de sleutels van Dictionary
en SortedList
typen zijn onder andere:
Boolean
Byte
DateTime
DateTimeOffset
Decimal
Double
Enum
Guid
Int16
Int32
Int64
Object
(Alleen bij serialisatie en als het runtimetype een van de ondersteunde typen in deze lijst is.)SByte
Single
String
UInt16
UInt32
UInt64
System.Data-naamruimte
Er zijn geen ingebouwde conversieprogramma's voor DataSet, DataTableen gerelateerde typen in de System.Data naamruimte. Het deserialiseren van deze typen van niet-vertrouwde invoer is niet veilig, zoals wordt uitgelegd in de beveiligingsrichtlijnen. U kunt echter een aangepast conversieprogramma schrijven om deze typen te ondersteunen. Zie RoundtripDataTable.cs voor voorbeelden van aangepaste conversieprogrammacode die een DataTable
serialiseert en deserializeert.