c# - 省略所选记录中的小数位

标签 c# json asp.net-web-api

我们有一个 Web API,它从 oracle 数据库中选择记录并以 JSON 格式返回结果。表中有几个字段是 Number 数据类型。因此,在 JSON 响应中,数字数据类型的字段具有小数位,例如 123.0.0。有没有办法我们可以只得到整数值并省略小数位,比如 123

public class DataController : ApiController
{
    [HttpGet]
    public HttpResponseMessage Getdetails(string id, DateTime date_in)
    {
        var prms = new List<OracleParameter>();
        prms.Add(new OracleParameter("id", OracleDbType.Varchar2, id, ParameterDirection.Input));
        prms.Add(new OracleParameter("date_in", OracleDbType.Date, date_in, ParameterDirection.Input));
        var connStr = ConfigurationManager.ConnectionStrings["DtConnection"].ConnectionString;
        using (OracleConnection dbconn = new OracleConnection(connStr))
        {
            DataSet userDataset = new DataSet();
            var strQuery = "SELECT REQUEST_ID from SAMPLE where id = :id and date_in = :date_in ";
            var returnObject = new { data = new OracleDataTableJsonResponse(connStr, strQuery, prms.ToArray()) };
            var response = Request.CreateResponse(HttpStatusCode.OK, returnObject, MediaTypeHeaderValue.Parse("application/json"));
            ContentDispositionHeaderValue contentDisposition = null;
            if (ContentDispositionHeaderValue.TryParse("inline; filename=TGSData.json", out contentDisposition))
            {
                response.Content.Headers.ContentDisposition = contentDisposition;
            }
            return response;
        }
    }
}

我们有两个类来处理 JSON

 [JsonConverter(typeof(OracleDataTableJsonResponseConverter))]
 public sealed class OracleDataTableJsonResponse
 {
  public string ConnectionString { get; private set; }
  public string QueryString { get; private set; }
  public OracleParameter[] Parameters { get; private set; }
  public OracleDataTableJsonResponse(string connStr, string strQuery, OracleParameter[] prms)
  {
   this.ConnectionString = connStr;
   this.QueryString = strQuery;
   this.Parameters = prms;
   }   }


  public class OracleDataTableJsonResponseConverter : JsonConverter
  {
   public override bool CanConvert(Type objectType)
   {
    return objectType == typeof(OracleDataTableJsonResponse);
   }
   public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
   {
    throw new NotImplementedException("OracleDataTableJsonResponse is only for writing JSON.  To read, deserialize into a DataTable");
   }
  public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
   {
   var response = (OracleDataTableJsonResponse)value;
   using (var dbconn = new OracleConnection(response.ConnectionString))
   {
     dbconn.Open();
     using (var selectCommand = new OracleCommand(response.QueryString, dbconn))
     {
      if (response.Parameters != null)
      selectCommand.Parameters.AddRange(response.Parameters);
      using (var reader = selectCommand.ExecuteReader())
      {
       writer.WriteDataTable(reader, serializer);
      } } }}}
      public static class JsonExtensions
      {
      public static void WriteDataTable(this JsonWriter writer, IDataReader reader, JsonSerializer serializer)
      {
      if (writer == null || reader == null || serializer == null)
      throw new ArgumentNullException();
      writer.WriteStartArray();
      while (reader.Read())
      {
        writer.WriteStartObject();
        for (int i = 0; i < reader.FieldCount; i++)
         {
           writer.WritePropertyName(reader.GetName(i));
           serializer.Serialize(writer, reader[i]);
         }
         writer.WriteEndObject();
        }
        writer.WriteEndArray();

JSON 结果看起来像

{"data":[{"REQUEST_ID":333838.0},
     {"REQUEST_ID":362692.0},
     {"REQUEST_ID":362692.0},
     {"REQUEST_ID":362692.0},
     {"REQUEST_ID":362692.0},
     {"REQUEST_ID":362692.0},
     {"REQUEST_ID":359544.0}]}

在 Oracle 数据库中,该字段看起来像

enter image description here

是否有可能选择省略小数位的数字数据类型的字段。

最佳答案

您需要在序列化值的代码中更新以下代码块

for (int i = 0; i < reader.FieldCount; i++)
{
    writer.WritePropertyName(reader.GetName(i));
    serializer.Serialize(writer, reader[i]);
}

改变如下,

for (int i = 0; i < reader.FieldCount; i++)
{
    string name =reader.GetName(i);
    writer.WritePropertyName(name);
    if(name  == "REQUEST_ID")
    {
       serializer.Serialize(writer, string.Format("{0:n0}",reader[i]));
    }else
    {
      serializer.Serialize(writer, reader[i]);
    }
}

关于c# - 省略所选记录中的小数位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40646401/

相关文章:

c# - 如何使用 IValidatableObject?

javascript - 我如何制作下拉类别列表?

c# - 忽略 web api 中序列化程序的空值和默认值

json - MongoDB - 带有 group_by 的嵌套数组的总和

javascript - NodeJS 服务器更改 JSON 对象的键名

c# - 如何在请求 json 中接收到未映射的字段时强制 Web API 抛出错误

asp.net-web-api - 将对象作为参数传递给 Breeze Controller 操作

c# - Debugger.Launch 不工作

c# - 不包含带 4 个参数的构造函数?

c# - MVC 5 中 PostAuthenticateRequest 管道中的空引用