十进制序列化 JSON 到 Web API

Decimal serialization JSON to Web API

我在获取 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。这 2 个数量在 .NET 中是两倍。

        [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 反序列化为小数。

例如你的 class 应该是

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);

按预期工作(fiddle:https://dotnetfiddle.net/YX5FsR)。

在 Web API 中,您将使用 [FromBody] 属性,它应该以完全相同的方式反序列化。

事实证明,它特定于反序列化 Delta 对象。 Delta 旨在与 ODataMediaTypeFormatter 一起使用,而将其与 JSON.NET (NewtonSoft) 一起使用在整数等方面存在问题。许多 SO 帖子支持此论点。

我终于使用了 Asp.net Delta Json Deserialization 并将其添加到网络配置中。经过数小时的调试和研究,这轻而易举地序列化了 Delta。