Depuis .net core et à partir de .net5, .net6, .net7, .net8 ASP .NET Core utilise System.Text.Json.JsonSerializer
au lieu de la bibliothèque NewtonSoft
, donc les réponses initiales de @aknuds1 et @silvio ne sont plus à jour.
Pour configurer la conversion des noms de propriété:
////Dans Program.cs ou dans des sous-modules, lors de la configuration des services au démarrage :
services
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
////Et d'autres options par exemple pour les énumérations :
//options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter(JsonNamingPolicy.CamelCase));
////et pour DateOnly nous pouvons enregistrer un convertisseur personnalisé :
//options.JsonSerializerOptions.Converters.Add(new DateOnlyJsonConverter());
});
////Puis dans le contrôleur :
[HttpGet]
public async Task FooMethod(CancellationToken cancellationToken)
{
var data = await GetData(cancellationToken);
return Ok(data);
}
Pour convertir manuellement en chaîne Json :
var jsonSerializerOptions = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
};
jsonSerializerOptions.Converters.Add(new JsonStringEnumConverter(JsonNamingPolicy.CamelCase));
////Et d'autres paramètres comme :
//jsonSerializerOptions.Converters.Add(new DateOnlyJsonConverter());
var jsonStr = System.Text.Json.JsonSerializer.Serialize(data, jsonSerializerOptions);
Exemple de convertisseur personnalisé :
//Valable pour .net6 si votre DTO contient un champ DateOnly
public class DateOnlyJsonConverter : JsonConverter
{
private const string Format = "yyyy-MM-dd";
public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
var str = reader.GetString();
return string.IsNullOrEmpty(str)? default : DateOnly.ParseExact(str, Format, CultureInfo.InvariantCulture);
}
public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString(Format, CultureInfo.InvariantCulture));
}
}