将object转换成dyamic类型 解决long输出到浏览器过长精度丢失问题
需求:
数据库使用飘雪算法保存唯一标识 是一个18位长整形
将数据输出到浏览器时出现了精度丢失问题,这是一个重大的BUG。如果没解决好整个项目都要改一遍。
讨论有三个办法
1、把所有实体 数据模型的long值手动换成string类型。——-这是一个工作庞大且极度无聊的事情,并且给人感觉很不好
2、将模型转换成json字符串,或者对象。 ———前者是将工作丢给前端,然后前端不干了....略, ———后者需要定义一个规则,在需要更改的地方加上一个标识,json转换的时候就会将数据转换成string,比第一个方法好很多,但是加了一倍的工作量。不仅需要改现成模型,以后的模型统统需要加上表示。
3、设定一个拦截器,对象转换json对象输出前转换成动态类型然后转换成json输出。———本文章所使用的方法
效果图:
输出的两段json:
thedyamicjson
[{"ID":"1234567890123456789","Detaile":{"Name":"小熊","Age":18},"Phone":[{"PhoneNumber":"131131131111","RegisteredData":"2018-03-29T16:17:20.5334508+08:00"},{"PhoneNumber":"131131131112","RegisteredData":"2018-03-29T16:17:20.5349548+08:00"}]},{"ID":"1234567890123456777","Detaile":{"Name":"小明","Age":22},"Phone":[{"PhoneNumber":"131131132222","RegisteredData":"2018-03-29T16:17:20.5354557+08:00"},{"PhoneNumber":"131131132224","RegisteredData":"2018-03-29T16:17:20.5354557+08:00"}]}]
thedobjectjson
[{"ID":1234567890123456789,"Detaile":{"Name":"小熊","Age":18},"Phone":[{"PhoneNumber":131131131111,"RegisteredData":"2018-03-29T16:17:20.5334508+08:00"},{"PhoneNumber":131131131112,"RegisteredData":"2018-03-29T16:17:20.5349548+08:00"}]},{"ID":1234567890123456777,"Detaile":{"Name":"小明","Age":22},"Phone":[{"PhoneNumber":131131132222,"RegisteredData":"2018-03-29T16:17:20.5354557+08:00"},{"PhoneNumber":131131132224,"RegisteredData":"2018-03-29T16:17:20.5354557+08:00"}]}]
可以看到第一段的ID类型全部加上了引号
代码:
三个测试用的基础类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class UserData { public long ID { get ; set ; } public UserDetaileData Detaile { get ; set ; } public List<PhoneData> Phone { get ; set ; } } class UserDetaileData { public string Name { get ; set ; } public int Age { get ; set ; } } class PhoneData { public long PhoneNumber { get ; set ; } public DateTime RegisteredData { get ; set ; } } |
三种类型对比支持,以后只需要维护这个三个变量就行了
1 2 3 | string Along = "Int64" ; string AGeneric = "List`1" ; IEnumerable< string > ATypeName = new List< string >() { "String" , "Int32" , "Int64" , "DateTime" , "Decimal" , "Double" , "Boolean" }; |
/// <summary> /// 将对象转换成动态类型变量 /// </summary> /// <param name="o"></param> /// <returns></returns> private static dynamic ObjectConversionDynamic(object o) { //非空判断 if (o==null) { return o; } //获取变量o 的type名称 string sa = o.GetType().Name; //判断是否为long型(转换输出) if (sa == Along) { return o.ToString(); } //判断是否为可输出变量(直接返回) if (ATypeName.Where(d => d == o.GetType().Name).ToList().Any()) { return o; } //判断是否为list (需要再次遍历,以防list中出现引用类型) if (sa == AGeneric) { return ListDynamic((IEnumerable)o); } //获取引用类型变量成员 var theva = o.GetType().GetProperties(); //初始化返回的结果值 dynamic result = new ExpandoObject(); //生成请求字典 IDictionary<string, object> thekeyValuePairs = (IDictionary<string, object>)result; foreach (var item in theva) { //添加至字典 thekeyValuePairs.Add(item.Name, ObjectConversionDynamic(item.GetValue(o))); } return result; } /// <summary> /// 将list转换成dynamic /// </summary> /// <param name="olist"></param> /// <returns></returns> static dynamic ListDynamic(IEnumerable olist) { List<dynamic> theydlist = new List<dynamic>(); foreach (var item in olist) { theydlist.Add(ObjectConversionDynamic(item)); } dynamic resultlist = theydlist; return resultlist; }
逻辑稍有些困难,
代码粘贴可用
Main函数
static void Main(string[] args) { List<UserData> user = new List<UserData>(); UserData UserA = new UserData() { ID = 1234567890123456789, Detaile = new UserDetaileData() { Age = 18, Name = "小熊" }, Phone = new List<PhoneData>() { new PhoneData(){ PhoneNumber=131131131111, RegisteredData=DateTime.Now, }, new PhoneData(){ PhoneNumber=131131131112, RegisteredData=DateTime.Now, } } }; UserData UserB = new UserData() { ID = 1234567890123456777, Detaile = new UserDetaileData() { Age = 22, Name = "小明" }, Phone = new List<PhoneData>() { new PhoneData(){ PhoneNumber=131131132222, RegisteredData=DateTime.Now, }, new PhoneData(){ PhoneNumber=131131132224, RegisteredData=DateTime.Now, } } }; user.Add(UserA); user.Add(UserB); dynamic thedynamic = ObjectConversionDynamic(user); string thedyamicjson = JsonConvert.SerializeObject(thedynamic); string thedobjectjson = JsonConvert.SerializeObject(user); Console.WriteLine(thedyamicjson); Console.Read(); }
至于以后还有有什么变更之类的就不管了,反正现在是可用。
埋自己的雷,让别人拆去吧!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!