在.NET Core 6 Web API中CamelCase不起作用。

7

我已将一个 web api 应用从 net core 5 迁移到了 6,并通过 System.Text.Json 替换了 NewtonSoft 序列化器。在我的 Startup.cs 文件中,我使用以下代码配置了 Json 序列化:

services.AddControllers(config =>
{
    config.RespectBrowserAcceptHeader = true;
    config.ReturnHttpNotAcceptable = true;
})
.AddJsonOptions(options =>
{
    options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
    options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
    options.JsonSerializerOptions.WriteIndented = true;
})
.AddXmlDataContractSerializerFormatters();

这段代码只部分地起作用。WriteIndented可以正常工作(请参见下面的截图),但我无法使camelcase起作用。

enter image description here

有什么建议吗? 谢谢


你好。JsonNamingPolicy.CamelCase 用于 PascalCase,对于以小写字母开头的 camelCase,这可能会有所帮助:https://dev59.com/Ibjna4cB1Zd3GeqP9mSD - Klemikaze
嗨@Klemikaze,您可以查看此文档:https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-customize-properties?pivots=dotnet-6-0#use-camel-case-for-all-json-property-names - Jose L. Garcia
1
你能分享一个[mcve]吗?{"Id" : 5, "Nombre": ""}这种类型是什么样子的?是否有可能直接应用自定义转换器,或者web api方法在手动序列化? - dbc
4个回答

5

经过多次尝试,我解决了这个问题。在最新版本中,“BaseController”没有默认问题,但“ODataController”存在相同的问题。

解决方案如下:

services
.AddControllers(opt => opt.Filters.Add(typeof(ValidateModelAttribute)))
.AddJsonOptions(o => {
   o.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
   o.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase;
   o.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
   o.JsonSerializerOptions.WriteIndented = true;
})
.AddOData(options => options.Select().Expand().Filter().OrderBy().SetMaxTop(32).Count());

阅读此文档,了解更多细节。


3
我可能有所遗漏……我在这里没有看到答案。 - Mike

0

检查您的配置。也许您仍在某种程度上使用Newtonsoft?

保险起见:配置两个库...

services
.AddMvc()
.AddJsonOptions(options => {
    options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
})
.AddNewtonsoftJson(options => {
    options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
    options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
    options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
    // options.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
});

-2

只需在 program.cs 文件中添加此内容即可

using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
using Newtonsoft.Json;
JsonConvert.DefaultSettings = () =>
 {
   var settings = new JsonSerializerSettings();
   settings.Converters.Add(new StringEnumConverter());
   settings.ContractResolver = new 
   CamelCasePropertyNamesContractResolver();
   return settings;
 };

OP表示他们没有使用Newtonsoft.Json。 - Rekesoft

-3
请尝试以下方法:在NewtonsoftJson中添加选项UseCamelCasing
services.AddControllers()
                .AddNewtonsoftJson(options =>
                {
                    options.SerializerSettings.ContractResolver = new DefaultContractResolver();
                    options.UseCamelCasing(true); // additional line here
                });

问题明确说明他用 System.Text.Json 替换了 NewtonSoft。 - Wes Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接