Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 257|回复: 0

[默认分类] 将object转换成dyamic类型 解决long输出到浏览器过长精度丢失问题

  [复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-3-30 09:40:50 | 显示全部楼层 |阅读模式
    需求:
    数据库使用飘雪算法保存唯一标识  是一个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.   class UserData {
    2.             public long ID { get; set; }
    3.            
    4.             public UserDetaileData Detaile { get; set; }
    5.             public List<PhoneData> Phone { get; set; }
    6.         }
    7.         class UserDetaileData {
    8.             public string Name { get; set; }
    9.             public int Age { get; set; }
    10.         }
    11.         class PhoneData {
    12.             public long PhoneNumber { get; set; }
    13.             public DateTime RegisteredData { get; set; }
    14.         }
    复制代码


      
    三种类型对比支持,以后只需要维护这个三个变量就行了

    1. string Along = "Int64";
    2. string AGeneric = "List`1";
    3. IEnumerable<string> ATypeName = new List<string>() { "String", "Int32", "Int64", "DateTime", "Decimal", "Double", "Boolean" };
    复制代码


      

    1. /// <summary>
    2.         /// 将对象转换成动态类型变量
    3.         /// </summary>
    4.         /// <param name="o"></param>
    5.         /// <returns></returns>
    6.         private static dynamic ObjectConversionDynamic(object o)
    7.         {
    8.             //非空判断
    9.             if (o==null)
    10.             {
    11.                 return o;
    12.             }
    13.             //获取变量o 的type名称
    14.             string sa = o.GetType().Name;
    15.             //判断是否为long型(转换输出)
    16.             if (sa == Along)
    17.             {
    18.                 return o.ToString();
    19.             }
    20.             //判断是否为可输出变量(直接返回)
    21.             if (ATypeName.Where(d => d == o.GetType().Name).ToList().Any())
    22.             {
    23.                 return  o;
    24.             }
    25.             //判断是否为list (需要再次遍历,以防list中出现引用类型)
    26.             if (sa == AGeneric)
    27.             {
    28.                 return ListDynamic((IEnumerable)o);
    29.             }
    30.             //获取引用类型变量成员
    31.             var theva = o.GetType().GetProperties();
    32.             //初始化返回的结果值
    33.             dynamic result = new ExpandoObject();
    34.             //生成请求字典
    35.             IDictionary<string, object> thekeyValuePairs = (IDictionary<string, object>)result;
    36.             foreach (var item in theva)
    37.             {
    38.                 //添加至字典
    39.                 thekeyValuePairs.Add(item.Name, ObjectConversionDynamic(item.GetValue(o)));
    40.             }
    41.             return result;
    42.         }
    43.         /// <summary>
    44.         /// 将list转换成dynamic
    45.         /// </summary>
    46.         /// <param name="olist"></param>
    47.         /// <returns></returns>
    48.          static  dynamic ListDynamic(IEnumerable olist) {
    49.             List<dynamic> theydlist = new List<dynamic>();
    50.             foreach (var item in olist)
    51.             {
    52.                 theydlist.Add(ObjectConversionDynamic(item));
    53.             }
    54.             dynamic resultlist = theydlist;
    55.             return resultlist;
    56.         }
    复制代码


      
    逻辑稍有些困难,
    代码粘贴可用
      
    Main函数

    1.    static void Main(string[] args)
    2.         {
    3.             List<UserData> user = new List<UserData>();
    4.             UserData UserA = new UserData()
    5.             {
    6.                 ID = 1234567890123456789,
    7.                 Detaile = new UserDetaileData()
    8.                 {
    9.                     Age = 18,
    10.                     Name = "小熊"
    11.                 },
    12.                 Phone = new List<PhoneData>() {
    13.                     new PhoneData(){
    14.                         PhoneNumber=131131131111,
    15.                         RegisteredData=DateTime.Now,
    16.                     },
    17.                      new PhoneData(){
    18.                         PhoneNumber=131131131112,
    19.                         RegisteredData=DateTime.Now,
    20.                     }
    21.                 }
    22.             };
    23.             UserData UserB = new UserData()
    24.             {
    25.                 ID = 1234567890123456777,
    26.                 Detaile = new UserDetaileData()
    27.                 {
    28.                     Age = 22,
    29.                     Name = "小明"
    30.                 },
    31.                 Phone = new List<PhoneData>() {
    32.                     new PhoneData(){
    33.                         PhoneNumber=131131132222,
    34.                         RegisteredData=DateTime.Now,
    35.                     },
    36.                      new PhoneData(){
    37.                         PhoneNumber=131131132224,
    38.                         RegisteredData=DateTime.Now,
    39.                     }
    40.                 }
    41.             };
    42.             user.Add(UserA);
    43.             user.Add(UserB);
    44.             dynamic thedynamic = ObjectConversionDynamic(user);
    45.             string thedyamicjson = JsonConvert.SerializeObject(thedynamic);
    46.             string thedobjectjson = JsonConvert.SerializeObject(user);
    47.            
    48.             Console.WriteLine(thedyamicjson);
    49.             Console.Read();
    50. }
    复制代码


      
      
    至于以后还有有什么变更之类的就不管了,反正现在是可用。
    埋自己的雷,让别人拆去吧!
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-27 07:07 , Processed in 0.441051 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表