ASP.NET 核心 MVC 动态 return 不是驼峰式

ASP.NET Core MVC dynamic return is not camelCased

Return 来自您的服务的强类型对象,它将 JSON 属性呈现为驼峰式命名法,因为这是 ASP.NET Core MVC 中的默认设置。

但是,有时我们需要使用 dynamic 关键字和 ExpandoObject class.

即时创建一些内容

这些属性不再是驼峰式的。

如何强制 ASP.NET 核心 MVC 来处理一切?

在您的 Startup.cs 中,您可以指定一个用于序列化的解析器。您正在寻找的那个是 CamelCasePropertyNamesContractResolver,它可以通过以下方式启用:

        services.AddMvc()
        .AddJsonOptions(options =>
        {
            options.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver();
        });

我已经用动态类型对其进行了测试,它按预期工作。

我最近一直在尝试使用 System.Text.JsonExpandoObject 序列化为 camelCase,但运气不佳。但是,我确实设法使用 Newtonsoft.Json.

实现了这一点

对于像我这样可能正在寻找单元级或非 MVC 解决方案而不是上面建议的配置级解决方案的人,这里是我的发现。

dynamic d = new ExpandoObject();
d.Foo = new ExpandoObject();
d.Foo.BarBaz = null;

使用 System.Text.JsonJsonSerializerOptions,属性 名称被序列化,但是,camelCasePropertyNamingPolicy 的值似乎被忽略了目前序列化(在撰写本文时在 .NET 5 上测试)。但是,它会继续序列化对象而不会出现故障或异常。

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

string json = JsonSerializer.Serialize<ExpandoObject>(d, options);
Console.WriteLine(json);

这将输出

{"Foo":{"BarBaz":null}}

我能够使用传递给 SerializeObject 方法的 CamelCasePropertyNamesContractResolver suggested previously as the instance of ContractResolver to use for the JsonSerialierSettings 实例达到预期的效果。

var settings = new JsonSerializerSettings 
{ 
    ContractResolver = new CamelCasePropertyNamesContractResolver() 
};

string output = JsonConvert.SerializeObject(d, settings);
Console.WriteLine(output);

输出是...

{"foo":{"barBaz":null}}

在 .NET 5 上,有一个特定的标志可以配置为序列化字典键

services.AddControllers()
                .AddJsonOptions(o =>
                    o.JsonSerializerOptions.DictionaryKeyPolicy = System.Text.Json.JsonNamingPolicy.CamelCase
                );

更多信息
JsonSerializerOptions.DictionaryKeyPolicy Property
GitHub Issue