十进制序列化 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。
我在获取 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。