我已将 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 工作正常(请参见下面的屏幕截图),但我无法让驼峰式工作。
有什么建议吗? 问候
经过多次尝试,我解决了这个问题。在最新版本中,“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());
阅读有关此文档的更多详细信息。
检查您的配置。也许您仍在使用 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;
});
就我而言,我在发布到服务器时遇到了问题,例如:
{
"myPropertyCamelCase": "..."
}
在模型绑定期间,出现错误,提示“MyPropertyCamelCase”未在请求中设置。问题是请求属性上缺少设置器,例如
public MyPropertyCamelCase { get; }
应该是
public MyPropertyCamelCase { get; set; }
不确定这是否有直接关系。
只需将其添加到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;
};
请尝试以下方式:在 NewtonsoftJson 中添加选项
UseCamelCasing
。
services.AddControllers()
.AddNewtonsoftJson(options =>
{
options.SerializerSettings.ContractResolver = new DefaultContractResolver();
options.UseCamelCasing(true); // additional line here
});