C# 控制ASP.Net Core 2.0的序列化设置,返回IActionResult
我已经创建了一个ASP.NET 2.0 webapi,并试图从一个返回IActionResult的方法返回一个抽象类型,即C# 控制ASP.Net Core 2.0的序列化设置,返回IActionResult,c#,asp.net-web-api,.net-core,C#,Asp.net Web Api,.net Core,我已经创建了一个ASP.NET 2.0 webapi,并试图从一个返回IActionResult的方法返回一个抽象类型,即 // GET api/trades/5 [HttpGet("{id}", Name = "GetTrade")] [ProducesResponseType(typeof(Trade), 200)] [ProducesResponseType(404)] public IActionResult Get(int id) {
// GET api/trades/5
[HttpGet("{id}", Name = "GetTrade")]
[ProducesResponseType(typeof(Trade), 200)]
[ProducesResponseType(404)]
public IActionResult Get(int id)
{
var item = _context.Trades.FirstOrDefault(trade => trade.Id == id);
if (item == null)
{
return NotFound();
}
return Ok(item);
}
交易类型是一个抽象基类,我希望序列化的JSON包含$type属性,以便客户端可以反序列化为正确的具体类型。如果我将方法更改为return Trade(返回的json包含一个带有具体类型名称的$type属性),而不是IActionResult(没有$type属性),下面的代码将控制输出序列化器
得到
{
"id": 1,
"createdDateTime": "2018-04-12T15:59:11.3680885+12:00"
...
}
以下工作与预期相符
// GET api/trades
[HttpGet]
public IEnumerable<Trade> Get()
{
return _context.Trades.ToList();
}
//获取api/trades
[HttpGet]
公共IEnumerable Get()
{
return_context.Trades.ToList();
}
问候
Dave将TypeNameHandling从
Auto
更改为Objects
将强制JSON序列化程序始终发出类型名
请将您的TypeNameHandling从
options.SerializerSettings.TypeNameHandling = TypeNameHandling.Auto;
到
请包含一些返回给JS客户端的预期和实际json对象结构。这将有助于每个人将您的问题可视化。我已按要求进行了编辑(客户端是.Net而不是JS),您可以尝试使用此选项
options.SerializerSettings.typenameholling=typenameholling.Objects
谢谢,这似乎一直有效。添加为正确的解决方案,我将其标记为答案。@user2981639默认情况下,web api使用JSON.NET序列化程序设置作为TypeNameHandling。无
,因此不包括$type,您可以根据需要更改它。
// GET api/trades
[HttpGet]
public IEnumerable<Trade> Get()
{
return _context.Trades.ToList();
}
options.SerializerSettings.TypeNameHandling = TypeNameHandling.Auto;
options.SerializerSettings.TypeNameHandling = TypeNameHandling.Objects