[英]Decimal serialization JSON to Web API
我在获取甚至包含float的json数据时遇到问题:10.0。
AngularJS
var replenishAccount = { ReloadThresholdAmount: parseFloat(vm.account.ReloadThresholdAmount), ReloadAmount: parseFloat(vm.account.ReloadAmount) };
var webApiUrl = "https://localhost:44301";
$http({ method: 'PATCH', url: webApiUrl + '/api/account/patch/' + vm.account.ID, data: angular.toJson(replenishAccount)})
JSON格式
{"ReloadThresholdAmount": 10.2, "ReloadAmount": 10}
我需要的是
{"ReloadThresholdAmount": 10.2, "ReloadAmount": 10.0}
如果我执行.toFix(2),则得到字符串,但Web api期望为十进制。
{"ReloadThresholdAmount": "10.2", "ReloadAmount": "10.0"}
基本上,Web Api抱怨它不能是字符串或整数。
Web API,我正在使用Delta。 .NET中这2个数字是两倍。
[Route("Patch/{id}")]
public IHttpActionResult Patch(int id, Delta<Account> account)
{
if (account == null)
return BadRequest();
Account accountFromDb = Account.GetInstanceByID(CurrentUser, id);
account.Patch(accountFromDb);
accountFromDb.Save(CurrentUser);
return Ok(account);
}
Json.NET是Web API的开箱即用的反序列化器,可以正确地将{"ReloadThresholdAmount": 10.2, "ReloadAmount": 10}
JSON反序列化为十进制。
例如你的班级应该是
public class ReplenishAccount
{
public decimal ReloadThresholdAmount;
public decimal ReloadAmount;
}
然后
var account = JsonConvert.DeserializeObject<ReplenishAccount>(json);
Console.WriteLine("ReloadThresholdAmount: {0:0.0}; ReloadAmount: {1:0.0}", account.ReloadThresholdAmount, account.ReloadAmount);
如预期般运作(小提琴: https : //dotnetfiddle.net/YX5FsR )。
在Web API中,您将使用[FromBody]
属性,并且它应该以完全相同的方式反序列化。
事实证明,它特定于反序列化Delta对象。 Delta旨在与ODataMediaTypeFormatter一起使用,并与JSON.NET(NewtonSoft)结合使用时,会遇到整数等错误。许多SO帖子都支持此参数。
我最终使用了Asp.net Delta Json反序列化并将其添加到Web配置中。 经过数小时的调试和研究,这轻松地将Delta序列化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.