Personalización de los nombres y valores de propiedades con System.Text.Json
De forma predeterminada, los nombres de propiedad y las claves de diccionario no se modifican en la salida JSON, ni siquiera el uso de mayúsculas y minúsculas. Los valores de enumeración se representan como números. En este artículo, aprenderá a:
Nota
Los valores predeterminados web son mayúsculas y minúsculas Camel.
- Personalizar nombres de propiedades individuales
- Convertir todos los nombres de propiedad en mayúsculas y minúsculas combinadas Camel
- Implementar una directiva de nomenclatura de propiedades personalizada
- Convertir claves de diccionario en mayúsculas y minúsculas combinadas Camel
- Convertir enumeraciones en cadenas y palabras con mayúsculas y minúsculas combinadas Camel
En el caso de otros escenarios que requieran un tratamiento especial de los nombres y valores de propiedades JSON, puede implementar convertidores personalizados.
Personalizar nombres de propiedades individuales
Para establecer el nombre de propiedades individuales, use el atributo [JsonPropertyName].
Aquí se muestra un tipo de ejemplo que se serializa y el JSON resultante:
public class WeatherForecastWithPropertyNameAttribute
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string Summary { get; set; }
[JsonPropertyName("Wind")]
public int WindSpeed { get; set; }
}
{
"Date": "2019-08-01T00:00:00-07:00",
"TemperatureCelsius": 25,
"Summary": "Hot",
"Wind": 35
}
Nombre de propiedad establecido por este atributo:
- Se aplica en ambas direcciones, para la serialización y la deserialización.
- Tiene prioridad sobre las directivas de nomenclatura de propiedades.
Uso de mayúsculas y minúsculas combinadas Camel en todos los nombres de propiedad JSON
Para usar palabras con mayúsculas y minúsculas combinadas Camel en todos los nombres de propiedad JSON, establezca JsonSerializerOptions.PropertyNamingPolicy en JsonNamingPolicy.CamelCase, tal y como se muestra en el ejemplo siguiente:
var serializeOptions = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
WriteIndented = true
};
jsonString = JsonSerializer.Serialize(weatherForecast, serializeOptions);
Aquí se muestra una clase de ejemplo que se serializa y la salida JSON:
public class WeatherForecastWithPropertyNameAttribute
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string Summary { get; set; }
[JsonPropertyName("Wind")]
public int WindSpeed { get; set; }
}
{
"date": "2019-08-01T00:00:00-07:00",
"temperatureCelsius": 25,
"summary": "Hot",
"Wind": 35
}
La directiva de nomenclatura de propiedades en mayúsculas y minúsculas combinadas Camel:
- Se aplica a la serialización y deserialización.
- Se invalida con atributos
[JsonPropertyName]. Este es el motivo por el que el nombre de la propiedad JSONWinddel ejemplo no usa mayúsculas y minúsculas combinadas Camel.
Uso de una directiva de nomenclatura de propiedades JSON personalizada
Para usar una directiva de nomenclatura de propiedades JSON personalizada, cree una clase que derive de JsonNamingPolicy e invalide el método ConvertName, tal y como se muestra en el ejemplo siguiente:
using System.Text.Json;
namespace SystemTextJsonSamples
{
public class UpperCaseNamingPolicy : JsonNamingPolicy
{
public override string ConvertName(string name) =>
name.ToUpper();
}
}
Establezca luego la propiedad JsonSerializerOptions.PropertyNamingPolicy en una instancia de la clase de directiva de nomenclatura:
var options = new JsonSerializerOptions
{
PropertyNamingPolicy = new UpperCaseNamingPolicy(),
WriteIndented = true
};
jsonString = JsonSerializer.Serialize(weatherForecast, options);
Aquí se muestra una clase de ejemplo que se serializa y la salida JSON:
public class WeatherForecastWithPropertyNameAttribute
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string Summary { get; set; }
[JsonPropertyName("Wind")]
public int WindSpeed { get; set; }
}
{
"DATE": "2019-08-01T00:00:00-07:00",
"TEMPERATURECELSIUS": 25,
"SUMMARY": "Hot",
"Wind": 35
}
La directiva de nomenclatura de propiedades JSON personalizada:
- Se aplica a la serialización y la deserialización.
- Se invalida con atributos
[JsonPropertyName]. Este es el motivo por el que el nombre de la propiedad JSONWinddel ejemplo no usa mayúsculas.
Claves de diccionario en mayúsculas y minúsculas combinadas Camel
Si una propiedad de un objeto que se va a serializar es de tipo Dictionary<string,TValue>, se pueden convertir las claves string en mayúsculas y minúsculas combinadas Camel. Para ello, establezca DictionaryKeyPolicy en JsonNamingPolicy.CamelCase, tal y como se muestra en el ejemplo siguiente:
var options = new JsonSerializerOptions
{
DictionaryKeyPolicy = JsonNamingPolicy.CamelCase,
WriteIndented = true
};
jsonString = JsonSerializer.Serialize(weatherForecast, options);
La serialización de un objeto con un diccionario denominado TemperatureRanges que tenga pares clave-valor "ColdMinTemp", 20 y "HotMinTemp", 40 se traduciría en una salida JSON similar a la del ejemplo siguiente:
{
"Date": "2019-08-01T00:00:00-07:00",
"TemperatureCelsius": 25,
"Summary": "Hot",
"TemperatureRanges": {
"coldMinTemp": 20,
"hotMinTemp": 40
}
}
La directiva de nomenclatura en mayúsculas y minúsculas combinadas Camel para las claves de diccionario se aplica solo a la serialización. Si se deserializa un diccionario, las claves coincidirán con el archivo JSON aunque se especifique JsonNamingPolicy.CamelCase para DictionaryKeyPolicy.
Enumeraciones como cadenas
De forma predeterminada, las enumeraciones se serializan como números. Para serializar nombres de enumeración como cadenas, use JsonStringEnumConverter.
Por ejemplo, supongamos que hay que serializar la siguiente clase que tiene una enumeración:
public class WeatherForecastWithEnum
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public Summary Summary { get; set; }
}
public enum Summary
{
Cold, Cool, Warm, Hot
}
Si el resumen es Hot, el JSON serializado tiene el valor numérico 3 de forma predeterminada:
{
"Date": "2019-08-01T00:00:00-07:00",
"TemperatureCelsius": 25,
"Summary": 3
}
En el código de ejemplo siguiente se serializan los nombres de enumeración en lugar de los valores numéricos y los nombres se convierten en mayúsculas y minúsculas combinadas Camel:
options = new JsonSerializerOptions
{
WriteIndented = true,
Converters =
{
new JsonStringEnumConverter(JsonNamingPolicy.CamelCase)
}
};
jsonString = JsonSerializer.Serialize(weatherForecast, options);
El JSON resultante tendrá un aspecto similar al siguiente:
{
"Date": "2019-08-01T00:00:00-07:00",
"TemperatureCelsius": 25,
"Summary": "hot"
}
Los nombres de cadena de enumeración también se pueden deserializar, tal y como se muestra en el ejemplo siguiente:
options = new JsonSerializerOptions
{
Converters =
{
new JsonStringEnumConverter(JsonNamingPolicy.CamelCase)
}
};
weatherForecast = JsonSerializer.Deserialize<WeatherForecastWithEnum>(jsonString, options);
Vea también
- Información general de System.Text.Json
- Cómo serializar y deserializar JSON
- Creación de instancias de JsonSerializerOptions
- Habilitación de la coincidencia sin distinción entre mayúsculas y minúsculas
- Omisión de propiedades
- Permiso del formato JSON no válido
- JSON de desbordamiento de control
- Conservación de las referencias
- Tipos inmutables y descriptores de acceso no públicos
- Serialización polimórfica
- Migración desde Newtonsoft.Json a System.Text.Json
- Personalización de la codificación de caracteres
- Escritura de serializadores y deserializadores personalizados
- Escritura de convertidores personalizados para la serialización de JSON
- Compatibilidad con DateTime y DateTimeOffset
- Referencia de API de System.Text.Json
- Referencia de API de System.Text.Json.Serialization