CamelCase 无法在 net core 6 Web api 中工作

问题描述 投票:0回答:5

我已将 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 工作正常(请参见下面的屏幕截图),但我无法让驼峰式工作。

有什么建议吗? 问候

c# asp.net-core-webapi system.text.json asp.net-core-6.0
5个回答
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());

阅读有关文档的更多详细信息。


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;
});

0
投票

就我而言,我在发布到服务器时遇到了问题,例如:

{
   "myPropertyCamelCase": "..."
}

在模型绑定期间,出现错误,提示“MyPropertyCamelCase”未在请求中设置。问题是请求属性上缺少设置器,例如

public MyPropertyCamelCase { get; }

应该是

public MyPropertyCamelCase { get; set; }

不确定这是否有直接关系。


-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;
 };

-3
投票

请尝试以下方式:在 NewtonsoftJson 中添加选项

UseCamelCasing

services.AddControllers()
                .AddNewtonsoftJson(options =>
                {
                    options.SerializerSettings.ContractResolver = new DefaultContractResolver();
                    options.UseCamelCasing(true); // additional line here
                });
© www.soinside.com 2019 - 2024. All rights reserved.