我们有一个ASP.NET Core 5 Web API后端以及一个ReactJS UI应用程序。在启动时,我们以如下方式示例化json框架:
services.AddControllers()
.AddNewtonsoftJson()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
});
字符串
它与“JsonPropertyName”属性一起工作得很好,即以下属性在JavaScript中正确接收为interfaceId
:
[JsonPropertyName("interfaceId")]
public long INTERFACE_ID { get; set; }
型
最终,有人决定将项目升级到.NET 7是个好主意,这导致json序列化停止工作。上面的例子在JavaScript中被接收为interfacE_ID
(小写和大写字符正是这样)。同样的,从JavaScript发送到Web API的json对象停止自动序列化为C#对象(得到http 400响应),所以我必须将控制器声明从
public IActionResult Insert([FromBody] Rol entity) => this.Ok(this.service.Insert(entity));
型
至
public IActionResult Insert([FromBody] JToken entity) => this.Ok(this.service.Insert(entity.ToObject<Rol>()));
型
我在这篇文章中看到JSON.Net serializer ignoring JsonProperty?,可能是json.net(或newtonsoft.json)版本上的冲突,所以我清理了所有内容并更新了所有nuget包,删除了System.Text.Json
和Newtonsoft.Json
包,只保留了Microsoft.AspNetCore.Mvc.NewtonsoftJson
。
我也尝试应用像这篇文章https://devblogs.microsoft.com/dotnet/system-text-json-in-dotnet-7/中提出的显式json命名转换器,但目前我什么也没实现。由于我不是.net7的Maven,我想知道问题在哪里,或者我是否错过了新框架所需的配置步骤。
谢啦,谢啦
编辑:非常感谢大家
@Serge提出的属性修改工作,所以Newtonsoft.json是处理请求的序列化器。因此,我从startup.cs中删除了.AddNewtonsoftJson()
,输出序列化(JavaScript的Web API)又开始正常工作了。
我仍然面临着输入序列化问题(HTTP 400),我猜与.net7可空策略有关,所以我正在寻找一种方法来获得触发HTTP 400响应的正确验证错误
2条答案
按热度按时间mqkwyuun1#
只需将System.Text.Json的name属性修复为Newtonsoft.Json
字符串
由于您在某些情况下使用Net7来避免验证错误(400),因此这将非常有用
型
4sup72z82#
答案是你所有回答的混合。最后,我决定删除Newtonsoft.Json,保留System.Text.Json,并调整我的模型类以避免.net7空属性验证