ASP.NET Core 3.0 System.Text.Json Camel案例序列化


19

在ASP.NET Core 3.0 Web API项目中,如何指定System.Text.Json序列化选项以自动将Pascal Case属性序列化/反序列化为Camel Case,反之亦然?

给定具有Pascal Case属性的模型,例如:

public class Person
{
    public string Firstname { get; set; }
    public string Lastname { get; set; }
}

以及使用System.Text.Json将JSON字符串反序列化为Person类类型的代码:

var json = "{\"firstname\":\"John\",\"lastname\":\"Smith\"}";
var person = JsonSerializer.Deserialize<Person>(json);

除非将JsonPropertyName与以下每个属性一起使用,否则不会成功反序列化:

public class Person
{
    [JsonPropertyName("firstname")
    public string Firstname { get; set; }
    [JsonPropertyName("lastname")
    public string Lastname { get; set; }
}

我在中尝试了以下方法startup.cs,但在仍然需要方面没有帮助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;
        });

如何使用新的System.Text.Json命名空间在ASP.NET Core 3.0中设置Camel Case序列化/反序列化?

谢谢!

Answers:


25

AddJsonOptions()System.Text.Json仅配置为MVC。如果要JsonSerializer在自己的代码中使用,则应将配置传递给它。

var options = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
};

var json = "{\"firstname\":\"John\",\"lastname\":\"Smith\"}";
var person = JsonSerializer.Parse<Person>(json, options);

无法使用System.Text.Json为整个项目/应用程序指定序列化选项?在System.Text.Json
Alexander Staroselsky(

我不这么认为。您需要通过设置
-Kahbazi


11

startup.cs

// keeps the casing to that of the model when serializing to json (default is converting to camelCase)
services.AddMvc()
    .AddJsonOptions(options => options.JsonSerializerOptions.PropertyNamingPolicy = null); 

这意味着您不需要导入newtonsoft.json。

的唯一其他选择options.JsonSerializerOptions.PropertyNamingPolicyJsonNamingPolicy.CamelCase。似乎没有其他JsonNamingPolicy命名策略选项,例如snake_case或PascalCase。


这对我有用。FTR,在此之前,我的服务中没有.AddMvc(),仅添加它即可添加AddJsonOptions。我所有的服务器-客户端序列化问题都消失了.....
Mark Lazz

10

您可以使用PropertyNameCaseInsensitive。您需要将其作为参数传递给解串器。

var json = "{\"firstname\":\"John\",\"lastname\":\"Smith\"}";
var options = new JsonSerializerOptions() { PropertyNameCaseInsensitive = true };
var person = JsonSerializer.Deserialize<Person>(json, options);

(来自docs):

获取或设置一个值,该值确定反序列化期间属性名称是否使用不区分大小写的比较。默认值为false

因此,它没有指定camelCase或PascalCase,但将使用不区分大小写的比较。不知道这是否满足您的要求。


注意:我无法在控制台应用程序中将该应用程序设置得很宽。如Kahbazi的回答所述 services.AddMvc().AddJsonOptionsservices.AddControllers().AddJsonOptions它将仅为MVC和WebApi控制器配置Json(例如,不会在控制台应用程序中配置Json设置应用程序)。以下仅配置通过控制器端点传递的Json的System.Text.Json:

services.AddControllers()
        .AddJsonOptions(options => {
            options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
         }); 

6

如果要CamelCase序列化,请在Startup.cs中使用以下代码:(例如firstName)

services.AddControllers()
        .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
        });

如果要PascalCase序列化,请在Startup.cs中使用以下代码:(例如FirstName)

services.AddControllers()
        .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNamingPolicy= null;
        );

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.