我刚刚将我的ASP Web API项目从.Net core 2.0升级到3.0。我在用
services.AddMvc()
.AddJsonOptions(options =>options.SerializerSettings.ContractResolver
= new DefaultContractResolver());
Run Code Online (Sandbox Code Playgroud)
以前是为了确保序列化JSON的小写字母。
升级到3.0后,出现此错误...
错误CS1061'IMvcBuilder'不包含'AddJsonOptions'的定义,找不到可以接受的扩展方法'AddJsonOptions'接受类型为'IMvcBuilder'的第一个参数(是否缺少using指令或程序集引用?)
根据Asp.Net Core 2.2中MvcJsonOptions的AddJsonOptions,Microsoft.AspNetCore.Mvc.Formatters.Json nuget包提供了AddJsonOptions扩展方法。我尝试安装/重新安装此程序,但仍然无法解决该方法。有趣的是,智能感知仅显示Microsoft.AspNetCore.Mvc.Formatters。即使我添加了Json nuget包,当我尝试添加using语句时也使用Xml。
有什么想法吗?该文档为AddJsonOptions只上升到.NET 2.2所以也许是方法已经在3.0赞成一些其他配置机制的被弃用?
我有一个.Net Core Web API.当模型属性与请求主体匹配时,它会自动映射模型.例如,如果您有这个类:
public class Package
{
public string Carrier { get; set; }
public string TrackingNumber { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如果请求主体是以下JSON,它会正确地将它绑定到POST端点:
{
carrier: "fedex",
trackingNumber: "123123123"
}
Run Code Online (Sandbox Code Playgroud)
我需要做的是指定要映射的自定义属性.例如,使用上面的同一个类,如果TrackingNumber进来,我需要能够映射到JSON tracking_number.
我怎么做?
我试图找出如何使用ASP.NET WebApi指定备用属性名称 - 并使其适用于反序列化+序列化以及JSON + XML.到目前为止,我只发现了部分解决方案.
我希望将属性名称公开为带有下划线的小写,并且(例如)为了具有不同的内部名称:
外部:
内部:
对于测试,这是一个POST控制器动作,只是传递它接收的内容:
// POST api/values
public TestSerialization Post([FromBody]TestSerialization value)
{
return value;
}
Run Code Online (Sandbox Code Playgroud)
还有一个测试实体:
public class TestSerialization
{
[DataMember(Name = "field_one")] // Doesn't appear to change anything
public string ItemOne { get; set; }
[JsonProperty(PropertyName = "field_two")] // Only works for serialization in JSON mode
public string ItemTwo { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我发现:
对于测试数据,我提交了4个属性,以查看反序列化的值,以及反序列化时的属性名称
我怎样才能做到这一点?
我创建了一个示例 dotnet core 3.0 Web API 项目并进行了以下更改,
using System.Runtime.Serialization;
namespace WebApplication17.Models
{
[DataContract]
public class TestData
{
[DataMember(Name = "testaction")]
public string Action { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
然后我在控制器中进行了更改WeatherForecastController,以添加一个 post 端点
[HttpPost("package/{packageName}/version/{version}")]
public void Post(string packageName, string version, [FromBody] TestData activityPayload)
{
Console.WriteLine(activityPayload.Action);
}
Run Code Online (Sandbox Code Playgroud)
现在我从邮递员那里打来电话或用身体卷曲
{
"testaction": "action"
}
Run Code Online (Sandbox Code Playgroud)
仍然在 的Post方法中WeatherForecastController,activityPayload.Action为null。
我期待它是“行动”
c# .net-core asp.net-core-webapi asp.net-core-3.0 .net-core-3.0
在提出这个问题之后,我试图在web api 2中获取所有这些序列化内容,我读了这篇 http://www.asp.net/web-api/overview/formats-and-model-binding/json -and-XML序列化
但现在我很困惑
1在我的webapiconfig中,我没有这一行
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.UseDataContractJsonSerializer = true;
Run Code Online (Sandbox Code Playgroud)
所以我认为我正在使用默认的Json.net序列化程序.无论如何,我仍然可以在类中使用DataContract,因此只有用DataMember属性修饰的属性才会被序列化.这两个假设是否正确?
2如果我没有使用DataContract修饰类,则所有属性都将被序列化.这发生在Json.net和DataContractJsonSerializer上
3如果我改变(如我链接的问题),序列化程序仍然使用它的解析器,是因为它是Json.net一个或一个与另一个无关的东西?因为如果我在全球使用它
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.UseDataContractJsonSerializer = true;
json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
Run Code Online (Sandbox Code Playgroud)
即使它没有提出任何问题,它似乎也没有提起(也没有使用自定义合约解决方案)
3如果我有一个派生自另一个的类,并且我使用DataContract装饰父类,在我看来,我必须使用DataMember来装饰子类的属性以进行序列化.或者我做错了什么?
谢谢