In ASP.NET Core 3.0 Web API project, how do you specify System.Text.Json serialization options to serialize/deserialize Pascal Case properties to Camel Case and vice versa automatically?
Given a model with Pascal Case properties such as:
public class Person
{
public string Firstname { get; set; }
public string Lastname { get; set; }
}
And code to use System.Text.Json to deserialize a JSON string to type of Person
class:
var json = "{\"firstname\":\"John\",\"lastname\":\"Smith\"}";
var person = JsonSerializer.Deserialize<Person>(json);
Does not successfully deserialize unless JsonPropertyName is used with each property like:
public class Person
{
[JsonPropertyName("firstname")
public string Firstname { get; set; }
[JsonPropertyName("lastname")
public string Lastname { get; set; }
}
I tried the following in startup.cs
, but it did not help in terms of still needing JsonPropertyName
:
services.AddMvc().AddJsonOptions(options =>
{
options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase;
options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
});
// also the following given it's a Web API project
services.AddControllers().AddJsonOptions(options => {
options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase;
options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
});
How can you set Camel Case serialize/deserialize in ASP.NET Core 3.0 using the new System.Text.Json namespace?
Thanks!
In
startup.cs
:This means you don't need to import newtonsoft.json.
The only other option for
options.JsonSerializerOptions.PropertyNamingPolicy
isJsonNamingPolicy.CamelCase
. There do not seem to be any otherJsonNamingPolicy
naming policy options, such as snake_case or PascalCase.You can use
PropertyNameCaseInsensitive
. You need to pass it as a parameter to the deserializer.which (from the docs):
So, it doesn't specify camelCase or PascalCase but it will use case-insensitive comparison. Not sure if this meets your requirements.
Note: I wasn't able to set this application wide. The below does not work after testing:
If you want CamelCase serialization use this code in Startup.cs: (for example firstName)
If you want PascalCase serialization use this code in Startup.cs: (for example FirstName)
AddJsonOptions()
would configSystem.Text.Json
only for MVC. If you want to useJsonSerializer
in your own code you should pass the config to it.You can still set it application wide by installing Microsoft.AspNetCore.Mvc.NewtonsoftJson Nuget Package, which allows you to use the previous Json serializer implementation :
Credits to Poke, answer found here : Where did IMvcBuilder AddJsonOptions go in .Net Core 3.0?