将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类型全部加上了引号
代码:
三个测试用的基础类
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输出到浏览器过长精度丢失问题的更多相关文章
- Map中object转换成boolean类型
Ajax请求查询数据之后,返回的是map类型, resultMap.put("flag", flag); 在接收到数据之后判断时,转换出现异常,导致页面点击按钮之后,页面没有反应, ...
- Angular js 双向绑定时字符串的转换成 数字类型的问题
问题: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <scrip ...
- java Object转换成指定的类型
java Object转换成指定的类型 /** * Object转成指定的类型 * @param obj * @param type * @param <T> * @return */ p ...
- JSON.stringify实例应用—将对象转换成JSON类型进行AJAX异步传值
在上一篇中,对JSON.stringify()方法有了初步的认识,并且做了一些简单的例子.本篇将进一步将JSON.stringify用在复杂些的实例中,例如如下需求: 在进jQuery AJAX异步传 ...
- Java 类型转换以及Object转成其他类型
Object转int int count=(int)map.get("count") int count=Integer.parseInt((String)map.get(&quo ...
- 将Object转换成Dictionary方法
如果Object是Dictionary类型,直接返回 如果Object是NameValueCollection类型,则添加到Dictionary里 如果Object是Hashtable类型,添加到Di ...
- 泛型(二)封装工具类CommonUtils-把一个Map转换成指定类型的javabean对象
1.commons-beanutils的使用 commons-beanutils-1.9.3.jar 依赖 commons-logging-1.2.jar 代码1: String className ...
- Swift - 将String类型的数字转换成数字类型
Swift中,如果要把字符串转换成数字类型(比如整型,浮点型等).可以先转成NSString类型,让后再转. 1 2 3 4 //将文本框中的值转换成数字 var i = (tf1.text as N ...
- 工作随笔——Golang interface 转换成其他类型
新的公司,新的氛围.一年了,打算写点什么.so,那就写google的golang语言吧. 最最最基础的语法结构见go语言菜鸟教程 接下来写点菜鸟教程没有的. go语言的设计者认为:go语言必须让程序员 ...
随机推荐
- JVM 运行参数 & 代码监控
1.Java代码监控 JDK提供java.lang.management包, 其实就是基于JMX技术规范,提供一套完整的MBean,动态获取JVM的运行时数据,达到监控JVM性能的目的. packag ...
- Class文件结构全面解析(上)
什么是Class文件? 在Java刚刚诞生的时候就提出了一个非常著名的口号:"一次编写,到处运行.(Write Once,Run Anywhere)".为了实现平台无关性,各种不同 ...
- Master原理
1.主备切换机制原理剖析与源码分析 2.注册机制原理剖析与源码分析 3.状态改变处理机制源码分析 4.资源调度机制源码分析(schedule(),两种资源调度算法)(核心) 一.主备切换机制原理 1. ...
- mysql 索引笔记
MyISAM引擎的B+Tree的索引 通过上图可以直接的看出, 在MyISAM对B+树的运用中明显的特点如下: 所有的非叶子节点中存储的全部是索引信息 在叶子节点中存储的 value值其实是 数据库中 ...
- Zabbix-(六) JMX监控
Zabbix-(六) JMX监控 一.前言 Zabbix提供了JMX监控,它通过JMX API获取JVM信息,从而提供监控数据.本文讲述使用JMX监控Tomcat的JVM信息. 准备 Zabbix S ...
- Previous operation has not finished; run 'cleanup' if it was interrupted最简单有效的解决方法
今天提交代码报错,看了看提示的错误,百度了一下,发现操作都比较繁琐,所以自己重新给一个最简单有效的. 有的要下载sqlite3.exe,借助它清空本地.svn\wc.db数据库文件里面的operati ...
- Nginx下HTTP强制重定向至HTTPS
Nginx下HTTP强制重定向至HTTPS 对于nginx来说,配置http强制重定向至https有多种多样的写法.可以直接rewrite,也可以用301重定向.但是直接拷贝网上的配置往往会出现问题, ...
- 《HelloGitHub》第 44 期
兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程.对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编 ...
- Java入门系列之集合HashMap源码分析(十四)
前言 我们知道在Java 8中对于HashMap引入了红黑树从而提高操作性能,由于在上一节我们已经通过图解方式分析了红黑树原理,所以在接下来我们将更多精力投入到解析原理而不是算法本身,HashMap在 ...
- centos 6.x 系统基础优化简版
Centos 6.x 系统基础优化 1.更换国内yum源 删除系统带的centos官方yum源 rm -rf /etc/yum.repos.d/* 使用国内阿里云源 curl -o /etc/yum. ...