【问题标题】:Decimal serialization JSON to Web API十进制序列化 JSON 到 Web API
【发布时间】:2015-05-12 16:30:39
【问题描述】:

我在获取包含偶数浮点数的 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 中是双倍的。

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

    }

【问题讨论】:

  • 为什么需要10.0 符号?一般来说,JavaScript 引擎将 10.0 视为等于 10,并将“不需要的小数”去掉,例如。在 JSON.stringify() 和 JSON.parse() 中。恕我直言,您应该在后端解决此问题,以便它将 10 视为与 10.0 相同。
  • 你应该发布 Web API 方法
  • 发布了带有 delta 的 web api。如果 10(10.0 从 js 中截断),则属性保持 0,但如果 10.01 则正确

标签: json angularjs serialization asp.net-web-api


【解决方案1】:

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] 属性,它应该以完全相同的方式反序列化。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-22
      • 2015-04-24
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多