需求:

数据库使用飘雪算法保存唯一标识  是一个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类型全部加上了引号

代码:

三个测试用的基础类

  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; } }

  

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

 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 = ,
Detaile = new UserDetaileData()
{
Age = ,
Name = "小熊"
},
Phone = new List<PhoneData>() {
new PhoneData(){
PhoneNumber=,
RegisteredData=DateTime.Now,
},
new PhoneData(){
PhoneNumber=,
RegisteredData=DateTime.Now,
}
}
};
UserData UserB = new UserData()
{
ID = ,
Detaile = new UserDetaileData()
{
Age = ,
Name = "小明"
},
Phone = new List<PhoneData>() {
new PhoneData(){
PhoneNumber=,
RegisteredData=DateTime.Now,
},
new PhoneData(){
PhoneNumber=,
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();
}

至于以后还有有什么变更之类的就不管了,反正现在是可用。

埋自己的雷,让别人拆去吧!

将object转换成dyamic类型 解决long输出到浏览器过长精度丢失问题的更多相关文章

  1. Map中object转换成boolean类型

    Ajax请求查询数据之后,返回的是map类型, resultMap.put("flag", flag); 在接收到数据之后判断时,转换出现异常,导致页面点击按钮之后,页面没有反应, ...

  2. Angular js 双向绑定时字符串的转换成 数字类型的问题

    问题: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <scrip ...

  3. java Object转换成指定的类型

    java Object转换成指定的类型 /** * Object转成指定的类型 * @param obj * @param type * @param <T> * @return */ p ...

  4. JSON.stringify实例应用—将对象转换成JSON类型进行AJAX异步传值

    在上一篇中,对JSON.stringify()方法有了初步的认识,并且做了一些简单的例子.本篇将进一步将JSON.stringify用在复杂些的实例中,例如如下需求: 在进jQuery AJAX异步传 ...

  5. Java 类型转换以及Object转成其他类型

    Object转int int count=(int)map.get("count") int count=Integer.parseInt((String)map.get(&quo ...

  6. 将Object转换成Dictionary方法

    如果Object是Dictionary类型,直接返回 如果Object是NameValueCollection类型,则添加到Dictionary里 如果Object是Hashtable类型,添加到Di ...

  7. 泛型(二)封装工具类CommonUtils-把一个Map转换成指定类型的javabean对象

    1.commons-beanutils的使用 commons-beanutils-1.9.3.jar 依赖 commons-logging-1.2.jar 代码1: String className ...

  8. Swift - 将String类型的数字转换成数字类型

    Swift中,如果要把字符串转换成数字类型(比如整型,浮点型等).可以先转成NSString类型,让后再转. 1 2 3 4 //将文本框中的值转换成数字 var i = (tf1.text as N ...

  9. 工作随笔——Golang interface 转换成其他类型

    新的公司,新的氛围.一年了,打算写点什么.so,那就写google的golang语言吧. 最最最基础的语法结构见go语言菜鸟教程 接下来写点菜鸟教程没有的. go语言的设计者认为:go语言必须让程序员 ...

随机推荐

  1. JVM 运行参数 & 代码监控

    1.Java代码监控 JDK提供java.lang.management包, 其实就是基于JMX技术规范,提供一套完整的MBean,动态获取JVM的运行时数据,达到监控JVM性能的目的. packag ...

  2. Class文件结构全面解析(上)

    什么是Class文件? 在Java刚刚诞生的时候就提出了一个非常著名的口号:"一次编写,到处运行.(Write Once,Run Anywhere)".为了实现平台无关性,各种不同 ...

  3. Master原理

    1.主备切换机制原理剖析与源码分析 2.注册机制原理剖析与源码分析 3.状态改变处理机制源码分析 4.资源调度机制源码分析(schedule(),两种资源调度算法)(核心) 一.主备切换机制原理 1. ...

  4. mysql 索引笔记

    MyISAM引擎的B+Tree的索引 通过上图可以直接的看出, 在MyISAM对B+树的运用中明显的特点如下: 所有的非叶子节点中存储的全部是索引信息 在叶子节点中存储的 value值其实是 数据库中 ...

  5. Zabbix-(六) JMX监控

    Zabbix-(六) JMX监控 一.前言 Zabbix提供了JMX监控,它通过JMX API获取JVM信息,从而提供监控数据.本文讲述使用JMX监控Tomcat的JVM信息. 准备 Zabbix S ...

  6. Previous operation has not finished; run 'cleanup' if it was interrupted最简单有效的解决方法

    今天提交代码报错,看了看提示的错误,百度了一下,发现操作都比较繁琐,所以自己重新给一个最简单有效的. 有的要下载sqlite3.exe,借助它清空本地.svn\wc.db数据库文件里面的operati ...

  7. Nginx下HTTP强制重定向至HTTPS

    Nginx下HTTP强制重定向至HTTPS 对于nginx来说,配置http强制重定向至https有多种多样的写法.可以直接rewrite,也可以用301重定向.但是直接拷贝网上的配置往往会出现问题, ...

  8. 《HelloGitHub》第 44 期

    兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程.对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编 ...

  9. Java入门系列之集合HashMap源码分析(十四)

    前言 我们知道在Java 8中对于HashMap引入了红黑树从而提高操作性能,由于在上一节我们已经通过图解方式分析了红黑树原理,所以在接下来我们将更多精力投入到解析原理而不是算法本身,HashMap在 ...

  10. centos 6.x 系统基础优化简版

    Centos 6.x 系统基础优化 1.更换国内yum源 删除系统带的centos官方yum源 rm -rf /etc/yum.repos.d/* 使用国内阿里云源 curl -o /etc/yum. ...