繁体   English   中英

十进制序列化JSON到Web API

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM