【问题标题】:c# WebApi serialization of decimalc# WebApi序列化十进制
【发布时间】:2016-07-11 18:03:36
【问题描述】:

我有一个返回列表的 WebApi 控制器。我的问题是,我不想在生成的 JSON 中出现 xxxx.0,因为这会在我的 javascript 中造成严重问题。有没有办法防止 .0 值的 .net 序列化,以使它们被截断?

当前输出:

{"Temperature":[[1465434000.0,4.00],[1465437600.0,15.40],[1465441200.0,15.26],

通缉:

{"Temperature":[[1465434000,4.00],[1465437600,15.40],[1465441200,15.26],

被序列化的对象:

public class ChartDataMonthly
{
    public List<decimal[]> Temperature { get; set; }

【问题讨论】:

  • 我假设您希望以一种在小数点不为零时保持小数点的方式?
  • 在我看来,它完全符合您的意图。它序列化的值是小数。任何消费代码都不应该有任何将其作为浮点数消费的问题。当然,我对您的问题没有很好的答案,您可能想研究自定义反序列化器。如果我记得,.net 更高版本的默认反序列化器是 JSON.net。应该很容易研究。
  • 老实说,我认为这很好。它不应该对您的客户产生影响。真正的问题是你为什么想要这个?为了美观?这对于 API 响应真的无关紧要。
  • as this makes serious problems in my javascript
  • 客户端是highcharts。它假定第一个值是时间戳。

标签: c# json serialization asp.net-web-api decimal


【解决方案1】:
public class ChartDataMonthly
{
    public List<decimal[]> Temperature { get; set; }

    public List<decimal[]> Round()
    {
        List<decimal[]> NewTemp = new List<decimal[]>();
        foreach(var t in Temperature)
        {
           t[0] = Math.Round(t[0], 0);
           NewTemp.Add(t)
        }

        return NewTemp;
    }
}

我看到一个与此类似的新答案大约在我发布前两分钟发布,但这大致是我开始的方式。您可以使用 return List 或 Json.SerializeObject 并通过稍微修改方法返回字符串以返回类似于@dckuehn 的答案的字符串。

【讨论】:

    【解决方案2】:

    我想我要开始在你的对象上为你的 javascript 模型创建一个新属性:

    public class ChartDataMonthly
    {
        public List<decimal[]> Temperature { get; set; }
    
        // This can be "unmapped" to ignore object mappers
        public List<string> RoundedTemperature 
        { 
            get
            {
                return Temperature.Select(t => Math.Round(t).ToString()).ToList();
            }
        }
        // rest of model
    }
    

    【讨论】:

      【解决方案3】:
          public class ChartDataMonthly
          {
              public List<decimal[]> _temperature;
              public List<decimal[]> Temperature
              {
                  get { return _temperature; }
                  set
                  {
                      _temperature = value;
                      //edit each value by reference
                      _temperature.ForEach(x => x.ToList().ForEach(y =>y= Convert.ToDecimal(Math.Round(Convert.ToDouble(y)))));
                  }
              }
          }
      

      未经测试,但我认为它应该自动完成工作 您只需将列表中每个数组的每个字段四舍五入即可。

      如果您在 setter/getter 中执行此操作,它会在 .net binder 将 JavaScript 绑定到您的对象时自动执行此操作

      【讨论】:

        猜你喜欢
        • 2012-05-06
        • 2010-12-09
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-21
        • 1970-01-01
        • 2017-07-22
        相关资源
        最近更新 更多