Delen via


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:

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:

Aangepaste verzamelingen met bekende problemen

Er zijn bekende problemen met de volgende aangepaste verzamelingen:

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 DataTableserialiseert en deserializeert.

Zie ook