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

Ale*_*sky 3 c# json asp.net-core system.text.json

在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; }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

public class Person
{
    [JsonPropertyName("firstname")
    public string Firstname { get; set; }
    [JsonPropertyName("lastname")
    public string Lastname { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我在中尝试了以下方法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;
        });
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

sut*_*hoy 39

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); 
Run Code Online (Sandbox Code Playgroud)

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

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


Ram*_*yev 35

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

services.AddControllers()
        .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
        });
Run Code Online (Sandbox Code Playgroud)

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

services.AddControllers()
        .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNamingPolicy= null;
        );
Run Code Online (Sandbox Code Playgroud)


hal*_*ldo 17

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

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

其中(来自文档):

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

因此,它不指定camelCase 或PascalCase,但它将使用不区分大小写的比较。


下面将为通过控制器端点传递的 Json 配置 System.Text.Json:

services.AddControllers()
        .AddJsonOptions(options => {
            options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
         }); 
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考:“PropertyNameCaseInsensitive”仅适用于传入的 JSON。` options.JsonSerializerOptions.PropertyNamingPolicy= null;` 将序列化传出的 JSON PascalCase (4认同)
  • @PiotrKula 说的是真的... PropertyNameCaseInsensitive 仅用于传入的 JSON 有效负载,但除了 PropertyNamingPolicy 规定序列化期间传出 JSON 有效负载创建的规则之外,它还期望传入的有效负载将符合反序列化的策略;如果没有,您的反序列化类成员将具有默认值 - 这其中 PropertyNameCaseInsensitive 填补了空白,无论传入的有效负载大小写如何,它都将允许反序列化成功。 (2认同)

小智 14

您仍然可以通过安装Microsoft.AspNetCore.Mvc.NewtonsoftJsonNuget Package来设置它的应用程序范围,这允许您使用以前的 Json 序列化器实现:

services.AddControllers()
        .AddNewtonsoftJson(options =>
        {
            options.SerializerSettings.ContractResolver = new DefaultContractResolver();
        });
Run Code Online (Sandbox Code Playgroud)

感谢 Poke,答案在这里找到: IMvcBuilder AddJsonOptions 在 .Net Core 3.0 中的位置?


Dav*_*ave 9

.NET Core 7 最小 API 解决方案

要防止在序列化期间将 pascal 大小写属性重命名为驼峰大小写,请使用构建器的服务属性的 ConfigureHttpJsonOptions 方法。

builder.Services.ConfigureHttpJsonOptions(options => options.SerializerOptions.PropertyNamingPolicy = null);
Run Code Online (Sandbox Code Playgroud)

要强制转换为驼峰式大小写(默认行为),请使用:

builder.Services.ConfigureHttpJsonOptions(options => options.SerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase);
Run Code Online (Sandbox Code Playgroud)


Kah*_*azi 6

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);
Run Code Online (Sandbox Code Playgroud)

  • 无法使用 System.Text.Json 为整个项目/应用程序指定序列化选项?这在 System.Text.Json 之前是微不足道的 (6认同)
  • @AlexanderStaroselsky - 不,请参阅[是否有办法全局设置 System.Text.Json.JsonSerializer 的默认选项?](/sf/ask/4083203561/)。 (3认同)