ASP.NET核心3.0 System.Text.Json Camel 大小写序列化

3lxsmp7m  于 2022-11-19  发布在  .NET
关注(0)|答案(7)|浏览(222)

在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序列化/反序列化?
谢谢你!

ubbxdtey

ubbxdtey1#

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

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

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

um6iljoc2#

如果您想要camelCase序列化,请在 Startup.cs 中使用以下代码:(例如名字)

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

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

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

sigwle7e3#

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.PropertyNamingPolicy的唯一其他选项是JsonNamingPolicy.CamelCase。似乎没有任何其他JsonNamingPolicy命名策略选项,如snake_case或PascalCase。

arknldoa

arknldoa4#

您可以使用PropertyNameCaseInsensitive。您需要将其作为参数传递给反序列化程序。

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

其中(来自docs):
获取或设置一个值,该值确定在反序列化期间属性的名称是否使用不区分大小写的比较。默认值为false
因此,它不会指定camelCase或PascalCase,但会使用不区分大小写的比较。
下面将为通过控制器端点传递的Json配置System.Text.Json:

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

edqdpe6u5#

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

services.AddControllers()
        .AddNewtonsoftJson(options =>
        {
            options.SerializerSettings.ContractResolver = new DefaultContractResolver();
        });

中 的 每 一 个
积分 戳 , 答案 在 这里 找到 :Where did IMvcBuilder AddJsonOptions go in .Net Core 3.0? 的 最 大 值

pxyaymoc

pxyaymoc6#

试试这个!
StartUp.csConfigureServices方法内部写入:

services.AddMvc()
                    .AddJsonOptions(options =>
                    options.JsonSerializerOptions.PropertyNamingPolicy
                     = JsonNamingPolicy.CamelCase);

您需要Newtonsoft.Json.SerializationSystem.Text.Json之类的名称空间

tjrkku2a

tjrkku2a7#

.NET Core 7最小API解决方案

若要防止在序列化期间将Pascal case属性重命名为Camel case,请使用生成器的service属性的ConfigureHttpJsonOptions方法。

builder.Services.ConfigureHttpJsonOptions(options => options.SerializerOptions.PropertyNamingPolicy = null);

要强制转换为camel大小写(默认行为),请用途:

builder.Services.ConfigureHttpJsonOptions(options => options.SerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase);

相关问题