Como escrever objetos .NET como JSON (serializar)
Este artigo mostra como usar o System.Text.Json namespace para serializar para JavaScript Object Notation (JSON). Se você estiver portando o código existente do Newtonsoft.Json
, consulte Como migrar para o System.Text.Json
.
Gorjeta
Você pode usar a assistência de IA para serializar para JSON com o GitHub Copilot.
Para gravar JSON em uma cadeia de caracteres ou em um arquivo, chame o JsonSerializer.Serialize método.
Exemplos de serialização
O exemplo a seguir cria JSON como uma cadeia de caracteres:
using System.Text.Json;
namespace SerializeBasic
{
public class WeatherForecast
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string? Summary { get; set; }
}
public class Program
{
public static void Main()
{
var weatherForecast = new WeatherForecast
{
Date = DateTime.Parse("2019-08-01"),
TemperatureCelsius = 25,
Summary = "Hot"
};
string jsonString = JsonSerializer.Serialize(weatherForecast);
Console.WriteLine(jsonString);
}
}
}
// output:
//{"Date":"2019-08-01T00:00:00-07:00","TemperatureCelsius":25,"Summary":"Hot"}
Dim jsonString As String
A saída JSON é reduzida (espaço em branco, recuo e caracteres de nova linha são removidos) por padrão.
O exemplo a seguir usa código síncrono para criar um arquivo JSON:
using System.Text.Json;
namespace SerializeToFile
{
public class WeatherForecast
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string? Summary { get; set; }
}
public class Program
{
public static void Main()
{
var weatherForecast = new WeatherForecast
{
Date = DateTime.Parse("2019-08-01"),
TemperatureCelsius = 25,
Summary = "Hot"
};
string fileName = "WeatherForecast.json";
string jsonString = JsonSerializer.Serialize(weatherForecast);
File.WriteAllText(fileName, jsonString);
Console.WriteLine(File.ReadAllText(fileName));
}
}
}
// output:
//{"Date":"2019-08-01T00:00:00-07:00","TemperatureCelsius":25,"Summary":"Hot"}
jsonString = JsonSerializer.Serialize(weatherForecast1)
File.WriteAllText(fileName, jsonString)
O exemplo a seguir usa código assíncrono para criar um arquivo JSON:
using System.Text.Json;
namespace SerializeToFileAsync
{
public class WeatherForecast
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string? Summary { get; set; }
}
public class Program
{
public static async Task Main()
{
var weatherForecast = new WeatherForecast
{
Date = DateTime.Parse("2019-08-01"),
TemperatureCelsius = 25,
Summary = "Hot"
};
string fileName = "WeatherForecast.json";
await using FileStream createStream = File.Create(fileName);
await JsonSerializer.SerializeAsync(createStream, weatherForecast);
Console.WriteLine(File.ReadAllText(fileName));
}
}
}
// output:
//{"Date":"2019-08-01T00:00:00-07:00","TemperatureCelsius":25,"Summary":"Hot"}
Dim createStream As FileStream = File.Create(fileName)
Await JsonSerializer.SerializeAsync(createStream, weatherForecast1)
Os exemplos anteriores usam inferência de tipo para o tipo que está sendo serializado. Uma sobrecarga de toma um parâmetro de Serialize()
tipo genérico:
using System.Text.Json;
namespace SerializeWithGenericParameter
{
public class WeatherForecast
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string? Summary { get; set; }
}
public class Program
{
public static void Main()
{
var weatherForecast = new WeatherForecast
{
Date = DateTime.Parse("2019-08-01"),
TemperatureCelsius = 25,
Summary = "Hot"
};
string jsonString = JsonSerializer.Serialize<WeatherForecast>(weatherForecast);
Console.WriteLine(jsonString);
}
}
}
// output:
//{"Date":"2019-08-01T00:00:00-07:00","TemperatureCelsius":25,"Summary":"Hot"}
jsonString = JsonSerializer.Serialize(Of WeatherForecastWithPOCOs)(weatherForecast)
Você também pode usar o GitHub Copilot para gerar código de serialização para você. Para obter instruções, consulte a seção Usar o Copilot do GitHub neste artigo.
Comportamento de serialização
- Por padrão, todas as propriedades públicas são serializadas. Você pode especificar propriedades a serem ignoradas. Você também pode incluir membros privados.
- O codificador padrão escapa caracteres não-ASCII, caracteres sensíveis a HTML dentro do intervalo ASCII e caracteres que devem ser escapados de acordo com a especificação JSON RFC 8259.
- Por padrão, JSON é minificado. Você pode imprimir o JSON.
- Por padrão, o invólucro de nomes JSON corresponde aos nomes .NET. Você pode personalizar a caixa de nome JSON.
- Por padrão, as referências circulares são detetadas e as exceções lançadas. Você pode preservar referências e lidar com referências circulares.
- Por padrão, os campos são ignorados. Você pode incluir campos.
Quando você usa System.Text.Json indiretamente em um aplicativo ASP.NET Core, alguns comportamentos padrão são diferentes. Para obter mais informações, consulte Padrões da Web para JsonSerializerOptions.
Os tipos suportados incluem:
Primitivos .NET que mapeiam para primitivas JavaScript, como tipos numéricos, cadeias de caracteres e booleano.
Objetos CLR antigos e simples (POCOs) definidos pelo usuário.
Matrizes unidimensionais e irregulares (
T[][]
).Coleções e dicionários dos seguintes namespaces:
- System.Collections
- System.Collections.Generic
- System.Collections.Immutable
- System.Collections.Concurrent
- System.Collections.Specialized
- System.Collections.ObjectModel
Para obter mais informações, consulte Tipos suportados no System.Text.Json.
Você pode implementar conversores personalizados para lidar com tipos adicionais ou para fornecer funcionalidade que não é suportada pelos conversores internos.
Aqui está um exemplo mostrando como uma classe que contém propriedades de coleção e um tipo definido pelo usuário é serializada:
using System.Text.Json;
namespace SerializeExtra
{
public class WeatherForecast
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string? Summary { get; set; }
public string? SummaryField;
public IList<DateTimeOffset>? DatesAvailable { get; set; }
public Dictionary<string, HighLowTemps>? TemperatureRanges { get; set; }
public string[]? SummaryWords { get; set; }
}
public class HighLowTemps
{
public int High { get; set; }
public int Low { get; set; }
}
public class Program
{
public static void Main()
{
var weatherForecast = new WeatherForecast
{
Date = DateTime.Parse("2019-08-01"),
TemperatureCelsius = 25,
Summary = "Hot",
SummaryField = "Hot",
DatesAvailable = new List<DateTimeOffset>()
{ DateTime.Parse("2019-08-01"), DateTime.Parse("2019-08-02") },
TemperatureRanges = new Dictionary<string, HighLowTemps>
{
["Cold"] = new HighLowTemps { High = 20, Low = -10 },
["Hot"] = new HighLowTemps { High = 60 , Low = 20 }
},
SummaryWords = new[] { "Cool", "Windy", "Humid" }
};
var options = new JsonSerializerOptions { WriteIndented = true };
string jsonString = JsonSerializer.Serialize(weatherForecast, options);
Console.WriteLine(jsonString);
}
}
}
// output:
//{
// "Date": "2019-08-01T00:00:00-07:00",
// "TemperatureCelsius": 25,
// "Summary": "Hot",
// "DatesAvailable": [
// "2019-08-01T00:00:00-07:00",
// "2019-08-02T00:00:00-07:00"
// ],
// "TemperatureRanges": {
// "Cold": {
// "High": 20,
// "Low": -10
// },
// "Hot": {
// "High": 60,
// "Low": 20
// }
// },
// "SummaryWords": [
// "Cool",
// "Windy",
// "Humid"
// ]
//}
Public Class WeatherForecastWithPOCOs
Public Property [Date] As DateTimeOffset
Public Property TemperatureCelsius As Integer
Public Property Summary As String
Public SummaryField As String
Public Property DatesAvailable As IList(Of DateTimeOffset)
Public Property TemperatureRanges As Dictionary(Of String, HighLowTemps)
Public Property SummaryWords As String()
End Class
Public Class HighLowTemps
Public Property High As Integer
Public Property Low As Integer
End Class
' serialization output formatted (pretty-printed with whitespace and indentation):
' {
' "Date": "2019-08-01T00:00:00-07:00",
' "TemperatureCelsius": 25,
' "Summary": "Hot",
' "DatesAvailable": [
' "2019-08-01T00:00:00-07:00",
' "2019-08-02T00:00:00-07:00"
' ],
' "TemperatureRanges": {
' "Cold": {
' "High": 20,
' "Low": -10
' },
' "Hot": {
' "High": 60,
' "Low": 20
' }
' },
' "SummaryWords": [
' "Cool",
' "Windy",
' "Humid"
' ]
' }
Serializar para UTF-8
É 5-10% mais rápido serializar para uma matriz de bytes UTF-8 do que usar os métodos baseados em cadeia de caracteres. Isso porque os bytes (como UTF-8) não precisam ser convertidos em strings (UTF-16).
Para serializar para uma matriz de bytes UTF-8, chame o JsonSerializer.SerializeToUtf8Bytes método:
byte[] jsonUtf8Bytes =JsonSerializer.SerializeToUtf8Bytes(weatherForecast);
Dim jsonUtf8Bytes As Byte()
Dim options As JsonSerializerOptions = New JsonSerializerOptions With {
.WriteIndented = True
}
jsonUtf8Bytes = JsonSerializer.SerializeToUtf8Bytes(weatherForecast1, options)
Uma Serialize sobrecarga que leva um Utf8JsonWriter também está disponível.
Serializar para JSON formatado
Para imprimir a saída JSON, defina JsonSerializerOptions.WriteIndented como true
:
using System.Text.Json;
namespace SerializeWriteIndented
{
public class WeatherForecast
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string? Summary { get; set; }
}
public class Program
{
public static void Main()
{
var weatherForecast = new WeatherForecast
{
Date = DateTime.Parse("2019-08-01"),
TemperatureCelsius = 25,
Summary = "Hot"
};
var options = new JsonSerializerOptions { WriteIndented = true };
string jsonString = JsonSerializer.Serialize(weatherForecast, options);
Console.WriteLine(jsonString);
}
}
}
// output:
//{
// "Date": "2019-08-01T00:00:00-07:00",
// "TemperatureCelsius": 25,
// "Summary": "Hot"
//}
Dim options As JsonSerializerOptions = New JsonSerializerOptions With {
.WriteIndented = True
}
jsonString = JsonSerializer.Serialize(weatherForecast, options)
A partir do .NET 9, você também pode personalizar o caractere de recuo e o tamanho usando IndentCharacter e IndentSize.
Gorjeta
Se você usar JsonSerializerOptions
repetidamente com as mesmas opções, não crie uma nova JsonSerializerOptions
instância cada vez que usá-la. Reutilize a mesma instância para cada chamada. Para obter mais informações, consulte Reutilizar instâncias JsonSerializerOptions.
Use o Copilot do GitHub para serializar para JSON
Você pode usar o GitHub Copilot em seu IDE para gerar código que usa System.Text.Json
para serializar para JSON. Você pode personalizar o prompt para usar campos de objeto que atendam às suas necessidades.
O texto a seguir mostra um exemplo de prompt para o Copilot Chat:
Generate code to use System.Text.Json to serialize an object to a JSON string.
The object contains the following fields: FirstName (string), Lastname (string), Age (int).
Provide example output.
O GitHub Copilot é alimentado por IA, então surpresas e erros são possíveis. Para obter mais informações, consulte Copilot FAQs.
Saiba mais sobre Copiloto GitHub no Visual Studio e Copiloto GitHub no VS Code.