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
相关产品推荐
相关产品推荐

