Podporované typy v System.Text.Json
Tento článek poskytuje přehled typů podporovaných pro serializaci a deserializaci.
Typy, které serializují jako objekty JSON
Následující typy serializují jako objekty JSON:
- Třídy*
- Struktury
- Rozhraní
- Záznamy a záznamy struktury
* Typy bez slovníku, které implementují IEnumerable<T> serializovat jako pole JSON. Typy slovníku, které implementují IEnumerable<T>, serializovat jako objekty JSON.
Následující fragment kódu ukazuje serializaci jednoduché struktury.
public static void Main()
{
var coordinates = new Coords(1.0, 2.0);
string json = JsonSerializer.Serialize(coordinates);
Console.WriteLine(json);
// Output:
// {"X":1,"Y":2}
}
public readonly struct Coords
{
public Coords(double x, double y)
{
X = x;
Y = y;
}
public double X { get; }
public double Y { get; }
}
Typy serializované jako pole JSON
Typy kolekcí .NET serializují jako pole JSON. System.Text.Json.JsonSerializer podporuje typ kolekce pro serializaci, pokud:
- Je odvozen z IEnumerable nebo IAsyncEnumerable<T>.
- Obsahuje prvky, které jsou serializovatelné.
Serializátor volá GetEnumerator() metodu a zapisuje prvky.
Deserializace je složitější a u některých typů kolekcí se nepodporuje.
Následující části jsou uspořádány podle oboru názvů a ukazují, které typy jsou podporovány pro serializaci a deserializaci.
- oboru názvů
System.Array - obor názvů System.Collections
- System.Collections.Generic – obor názvů
- System.Collections.Immutable – oboru názvů
- System.Collections.Specialized – obor názvů
- System.Collections.Concurrent – oboru názvů
- oboru názvů
System.Collections.ObjectModel - vlastních kolekcí
Obor názvů System.Array
Typ | Serializace | Deserializace |
---|---|---|
jednorozměrných polích | ✔️ | ✔️ |
vícerozměrných polích | ❌ | ❌ |
|
✔️ | ✔️ |
System.Collections – obor názvů
Typ | Serializace | Deserializace |
---|---|---|
ArrayList | ✔️ | ✔️ |
BitArray | ✔️ | ❌ |
DictionaryEntry | ✔️ | ✔️ |
Hashtable | ✔️ | ✔️ |
ICollection | ✔️ | ✔️ |
IDictionary | ✔️ | ✔️ |
IEnumerable | ✔️ | ✔️ |
IList | ✔️ | ✔️ |
Queue | ✔️ | ✔️ |
SortedList | ✔️ | ✔️ |
Stack * | ✔️ | ✔️ |
* Viz Podpora pro Stack
typy.
System.Collections.Generic – obor názvů
Typ | Serializace | Deserializace |
---|---|---|
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> : | ✔️ | ✔️ |
* Viz Podporované typy klíčů.
† Viz následující část IAsyncEnumerable<T>
.
• Viz Podpora odezvy pro Stack
typy.
IAsyncEnumerable<T>
Následující příklady používají streamy jako reprezentaci libovolného asynchronního zdroje dat. Zdrojem můžou být soubory na místním počítači nebo výsledky z databázového dotazu nebo volání rozhraní API webové služby.
Serializace streamu
System.Text.Json
podporuje serializaci hodnot IAsyncEnumerable<T> jako pole JSON, jak je znázorněno v následujícím příkladu:
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>
hodnoty jsou podporovány pouze asynchronními serializačními metodami, například JsonSerializer.SerializeAsync.
Deserializace datových proudů
Metoda DeserializeAsyncEnumerable
podporuje deserializaci streamování, jak je znázorněno v následujícím příkladu:
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
Metoda DeserializeAsyncEnumerable
podporuje čtení pouze z polí JSON na kořenové úrovni.
Metoda DeserializeAsync podporuje IAsyncEnumerable<T>
, ale jeho podpis neumožňuje streamování. Vrátí konečný výsledek jako jednu hodnotu, jak je znázorněno v následujícím příkladu.
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
V tomto příkladu deserializátor vyrovnávací paměti všechny IAsyncEnumerable<T>
obsah před vrácením deserializovaného objektu. Toto chování je nezbytné, protože deserializátor musí před vrácením výsledku přečíst celou datovou část JSON.
System.Collections.Immutable – obor názvů
Typ | Serializace | Deserializace |
---|---|---|
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> * | ✔️ | ✔️ |
* Viz Podpora pro Stack
typy.
† Viz podporované typy klíčů.
System.Collections.Specialized – obor názvů
Typ | Serializace | Deserializace |
---|---|---|
BitVector32 | ✔️ | ❌* |
HybridDictionary | ✔️ | ✔️ |
IOrderedDictionary | ✔️ | ❌ |
ListDictionary | ✔️ | ✔️ |
NameValueCollection | ✔️ | ❌ |
StringCollection | ✔️ | ❌ |
StringDictionary | ✔️ | ❌ |
* Při deserializaci BitVector32 se vlastnost Data přeskočí, protože nemá veřejnou setter. Není vyvolán žádná výjimka.
System.Collections.Concurrent – obor názvů
Typ | Serializace | Deserializace |
---|---|---|
BlockingCollection<T> | ✔️ | ❌ |
ConcurrentBag<T> | ✔️ | ❌ |
ConcurrentDictionary<TKey,TValue> † | ✔️ | ✔️ |
ConcurrentQueue<T> | ✔️ | ✔️ |
ConcurrentStack<T> * | ✔️ | ✔️ |
* Viz Podpora pro Stack
typy.
† Viz podporované typy klíčů.
System.Collections.ObjectModel – obor názvů
Typ | Serializace | Deserializace |
---|---|---|
Collection<T> | ✔️ | ✔️ |
keyedCollection<řetězec, TValue> * | ✔️ | ❌ |
ObservableCollection<T> | ✔️ | ✔️ |
ReadOnlyCollection<T> | ✔️ | ❌ |
ReadOnlyDictionary<TKey,TValue> | ✔️ | ❌ |
ReadOnlyObservableCollection<T> | ✔️ | ❌ |
* Klíče, které nejsoustring
, nejsou podporované.
Vlastní kolekce
Každý typ kolekce, který není v jednom z předchozích oborů názvů, se považuje za vlastní kolekci. Tyto typy zahrnují uživatelem definované typy a typy definované ASP.NET Core. Například Microsoft.Extensions.Primitives je v této skupině.
Všechny vlastní kolekce (vše, co je odvozeno z IEnumerable
) jsou podporovány pro serializaci, pokud jsou podporovány jejich typy prvků.
Podpora deserializace
Vlastní kolekce se podporuje pro deserializaci, pokud:
Není rozhraní ani abstraktní.
Má konstruktor bez parametrů.
Obsahuje typy prvků, které jsou podporovány JsonSerializer.
Implementuje nebo dědí jedno nebo více následujících rozhraní nebo tříd:
- ConcurrentQueue<T>
- ConcurrentStack<T> *
- ICollection<T>
- IDictionary
- IDictionary<TKey,TValue> †
- IList
- IList<T>
- Queue
- Queue<T>
- Stack *
- Stack<T> *
* Viz Podpora pro
Stack
typy.† Viz podporované typy klíčů.
Známé problémy
Existují známé problémy s následujícími vlastními kolekcemi:
- ExpandoObject: Viz dotnet/runtime#29690.
- DynamicObject: Viz dotnet/runtime#1808.
- DataTable: Viz dotnet/docs#21366.
- Microsoft.AspNetCore.Http.FormFile: Viz dotnet/runtime#1559.
- Microsoft.AspNetCore.Http.IFormCollection: Viz dotnet/runtime#1559.
Další informace o známých problémech naleznete v otevřené problémy v System.Text.Json.
Podporované typy klíčů
Při použití jako klíče Dictionary
a SortedList
typů mají následující typy integrovanou podporu:
Boolean
Byte
DateTime
DateTimeOffset
Decimal
Double
Enum
Guid
Int16
Int32
Int64
-
Object
(pouze při serializaci a pokud je typ modulu runtime jedním z podporovaných typů v tomto seznamu.) SByte
Single
String
- TimeSpan
UInt16
UInt32
UInt64
- Uri
- Version
Kromě toho metody JsonConverter<T>.WriteAsPropertyName(Utf8JsonWriter, T, JsonSerializerOptions) a JsonConverter<T>.ReadAsPropertyName(Utf8JsonReader, Type, JsonSerializerOptions) umožňují přidat podporu klíče slovníku pro libovolný typ vašeho výběru.
Nepodporované typy
Serializace nepodporuje následující typy:
- System.Type a System.Reflection.MemberInfo
- obecně ReadOnlySpan<T>, Span<T>a ref struktury
- Typy delegátů
- IntPtr a UIntPtr
System.Data – obor názvů
Neexistují žádné integrované převaděče pro DataSet, DataTablea související typy v oboru názvů System.Data. Deserializace těchto typů z nedůvěryhodného vstupu není bezpečná, jak je vysvětleno v pokyny k zabezpečení. Můžete však napsat vlastní převaděč pro podporu těchto typů. Vzorový kód vlastního převaděče, který serializuje a deserializuje DataTable
, viz RoundtripDataTable.cs.
Viz také
- naplnění inicializovaných vlastností
- System.Text.Json přehledu
- Referenční rozhraní API
- System.Text.Json. Referenční rozhraní API pro serializaci