Serialização e desserialização JSON (empacotamento e desempacotamento) no .NET - visão geral
O System.Text.Json namespace fornece funcionalidade para serializar e desserializar a partir de JavaScript Object Notation (JSON). Serialização é o processo de converter o estado de um objeto, ou seja, os valores de suas propriedades, em uma forma que pode ser armazenada ou transmitida. O formulário serializado não inclui nenhuma informação sobre os métodos associados de um objeto. A desserialização reconstrói um objeto a partir do formulário serializado.
O design da System.Text.Json
biblioteca enfatiza o alto desempenho e a baixa alocação de memória em um extenso conjunto de recursos. O suporte UTF-8 integrado otimiza o processo de leitura e gravação de texto JSON codificado como UTF-8, que é a codificação mais prevalente para dados na Web e arquivos no disco.
A biblioteca também fornece classes para trabalhar com um modelo de objeto de documento (DOM) na memória. Esse recurso permite o acesso aleatório aos elementos em um arquivo JSON ou cadeia de caracteres.
Para o Visual Basic, há algumas limitações sobre quais partes da biblioteca você pode usar. Para obter mais informações, consulte Suporte do Visual Basic.
Como obter a biblioteca
A biblioteca é interna como parte da estrutura compartilhada para .NET Core 3.0 e versões posteriores. O recurso de geração de origem é interno como parte da estrutura compartilhada para .NET 6 e versões posteriores.
Para versões de estrutura anteriores ao .NET Core 3.0, instale o System.Text.Json pacote NuGet. O pacote suporta:
- .NET Standard 2.0 e posterior
- .NET Framework 4.6.2 e posterior
- .NET Core 2.1 e posterior
- .NET 5 e posterior
Namespaces e APIs
- O System.Text.Json namespace contém todos os pontos de entrada e os tipos principais.
- O System.Text.Json.Serialization namespace contém atributos e APIs para cenários avançados e personalização específica para serialização e desserialização.
Os exemplos de código mostrados neste artigo exigem using
diretivas para um ou ambos esses namespaces.
Importante
System.Text.Json
não suporta as seguintes APIs de serialização que você pode ter usado anteriormente:
- Atributos do System.Runtime.Serialization namespace.
- O System.SerializableAttribute atributo e a ISerializable interface. Esses tipos são usados apenas para serialização binária e XML.
Métodos de extensão HttpClient e HttpContent
Serializar e desserializar cargas úteis JSON da rede são operações comuns. Os métodos de extensão em HttpClient e HttpContent permitem que você faça essas operações em uma única linha de código. Esses métodos de extensão usam padrões da Web para JsonSerializerOptions.
O exemplo a seguir ilustra o uso de HttpClientJsonExtensions.GetFromJsonAsync e HttpClientJsonExtensions.PostAsJsonAsync:
using System.Net.Http.Json;
namespace HttpClientExtensionMethods
{
public class User
{
public int Id { get; set; }
public string? Name { get; set; }
public string? Username { get; set; }
public string? Email { get; set; }
}
public class Program
{
public static async Task Main()
{
using HttpClient client = new()
{
BaseAddress = new Uri("https://jsonplaceholder.typicode.com")
};
// Get the user information.
User? user = await client.GetFromJsonAsync<User>("users/1");
Console.WriteLine($"Id: {user?.Id}");
Console.WriteLine($"Name: {user?.Name}");
Console.WriteLine($"Username: {user?.Username}");
Console.WriteLine($"Email: {user?.Email}");
// Post a new user.
HttpResponseMessage response = await client.PostAsJsonAsync("users", user);
Console.WriteLine(
$"{(response.IsSuccessStatusCode ? "Success" : "Error")} - {response.StatusCode}");
}
}
}
// Produces output like the following example but with different names:
//
//Id: 1
//Name: Tyler King
//Username: Tyler
//Email: Tyler@contoso.com
//Success - Created
Imports System.Net.Http
Imports System.Net.Http.Json
Namespace HttpClientExtensionMethods
Public Class User
Public Property Id As Integer
Public Property Name As String
Public Property Username As String
Public Property Email As String
End Class
Public Class Program
Public Shared Async Function Main() As Task
Using client As New HttpClient With {
.BaseAddress = New Uri("https://jsonplaceholder.typicode.com")
}
' Get the user information.
Dim user1 As User = Await client.GetFromJsonAsync(Of User)("users/1")
Console.WriteLine($"Id: {user1.Id}")
Console.WriteLine($"Name: {user1.Name}")
Console.WriteLine($"Username: {user1.Username}")
Console.WriteLine($"Email: {user1.Email}")
' Post a new user.
Dim response As HttpResponseMessage = Await client.PostAsJsonAsync("users", user1)
Console.WriteLine(
$"{(If(response.IsSuccessStatusCode, "Success", "Error"))} - {response.StatusCode}")
End Using
End Function
End Class
End Namespace
' Produces output like the following example but with different names:
'
'Id: 1
'Name: Tyler King
'Username: Tyler
'Email: Tyler@contoso.com
'Success - Created
Há também métodos de extensão para System.Text.Json em HttpContent.
Reflexão vs. geração de fontes
Por padrão, System.Text.Json
reúne os metadados necessários para acessar propriedades de objetos para serialização e desserialização em tempo de execução usando reflexão. Como alternativa, System.Text.Json
pode usar o recurso de geração de código-fonte C# para melhorar o desempenho, reduzir o uso de memória privada e facilitar o corte de montagem, o que reduz o tamanho do aplicativo.
Para obter mais informações, consulte Reflexão versus geração de origem.
Informações de segurança
Para obter informações sobre ameaças à segurança que foram consideradas ao projetar JsonSerializere como elas podem ser atenuadas, consulte System.Text.Json
Modelo de ameaça.
Segurança de roscas
O System.Text.Json
serializador foi projetado com a segurança do thread em mente. Na prática, isso significa que, uma vez bloqueadas, JsonSerializerOptions as instâncias podem ser compartilhadas com segurança em vários threads. JsonDocument fornece uma representação DOM imutável e, no .NET 8 e versões posteriores, thread-safe, para valores JSON.