99

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

谢谢!

4

6 回答 6

112

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);
于 2019-10-20T19:55:21.793 回答
45

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。

于 2019-12-03T18:37:59.180 回答
41

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

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

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

services.AddControllers()
        .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNamingPolicy= null;
        );
于 2020-01-24T07:31:05.090 回答
18

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

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

其中(来自文档):

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

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


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

services.AddControllers()
        .AddJsonOptions(options => {
            options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
         }); 
于 2019-10-20T19:56:52.483 回答
12

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

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

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

于 2019-11-18T16:39:55.597 回答
1

试试这个!

在方法StartUp.cs里面ConfigureServices写:

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

您需要命名空间,例如 Newtonsoft.Json.Serialization&System.Text.Json

于 2021-08-19T19:34:14.527 回答