You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Newtonsoft.Json序列化Oracle数字为浮点数引发反序列化失败问题及解决

问题:Oracle DataTable序列化为JSON时整数转为浮点数导致反序列化失败

问题场景

将Oracle数据库中的数据读取到C# DataTable后,序列化为JSON时发现,原本为整数的uniqueId(如1335)被转换为1335.0格式的浮点数,导致后续反序列化到实体类时抛出错误。

关键信息

  • 数据库列定义:
REQUEST_ID      NUMBER(20,0)
  • 查询语句片段:
SELECT req.REQUEST_ID AS "uniqueId", 
  • 获取DataTable代码:
DataTable dt = ODCException.GetError();

查看DataTable行数据时,uniqueId显示为1335、1336等整数。

  • 实体类定义:
public class jsonObject
{
    public int uniqueId { get; set; }
    // 其他属性省略
}
  • 序列化代码:
string JSONresult = JsonConvert.SerializeObject(dt);

生成的JSON结果片段:

[{"uniqueId":1335.0,...}, {"uniqueId":1336.0,...}]
  • 反序列化代码及报错:
List<jsonObject> loErrorData = JsonConvert.DeserializeObject<IEnumerable<jsonObject>>(JSONresult).ToList();

报错信息:

{"Input string '1335.0' is not a valid integer. Path '[0].uniqueId', line 1, position 19."}

需求:让uniqueId在JSON中以整数形式存在,而非浮点数。

已验证的解决方案

即便数据库列定义为NUMBER(28,0)(无小数位),uniqueId仍会被序列化为浮点数。通过重新构造DataTable并指定列类型为Int32可解决该问题,修复代码如下:

public static DataTable GetTCErrors()
{
    DataSet ds = oRespository.GetErrors();  // 从数据库获取数据
    DataTable dt2 = new DataTable();

    if (ds.Tables.Count > 0)
    {
        DataTable dt = ds.Tables[0];
        dt2.Columns.Add("uniqueId", typeof(Int32));
        dt2.Load(dt.CreateDataReader(), LoadOption.OverwriteChanges);
    }
    return dt2;
}

使用修复后的方法获取DataTable再序列化:

DataTable dt = ODCException.GetTCErrors();
string JSONresult = JsonConvert.SerializeObject(dt);

此时JSON结果中的uniqueId值为1335、1336等整数格式,反序列化可正常执行。

内容的提问来源于stack exchange,提问作者NoBullMan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 14:03:26