需求:

数据库使用飘雪算法保存唯一标识  是一个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. mysql去重查询表中数据

    1.distinct select count(distinct CName) from teble select count(CName) from (select distinct CName f ...

  2. nyoj 96-n-1位数 (strlen, atoi, ceil)

    96-n-1位数 内存限制:64MB 时间限制:3000ms 特判: No 通过数:30 提交数:47 难度:1 题目描述: 已知w是一个大于10但不大于1000000的无符号整数,若w是n(n≥2) ...

  3. 【Vue | ElementUI】Vue离开当前页面时弹出确认框实现

    Vue离开当前页面时弹出确认框实现 1. 实现目的 在某种业务场景下,用户不允许跳转到其他页面.于是,需要在用户误操作或者是点击浏览器跳转时提示用户. 2. 实现原理 使用路由守卫beforeRout ...

  4. Pashmak and Graph(dp + 贪心)

    题目链接:http://codeforces.com/contest/459/problem/E 题意:给一个带权有向图, 找出其中最长上升路的长度. 题解:先按权值对所有边排序, 然后依次 u -& ...

  5. 从静态代理,jdk动态代理到cglib动态代理-一文搞懂代理模式

    从代理模式到动态代理 代理模式是一种理论上非常简单,但是各种地方的实现往往却非常复杂.本文将从代理模式的基本概念出发,探讨代理模式在java领域的应用与实现.读完本文你将get到以下几点: 为什么需要 ...

  6. php为什么要用swoole?

    最近两个月一直在研究 Swoole,那么借助这篇文章,我希望能够把 Swoole 安利给更多人.虽然 Swoole 可能目前定位是一些高级 phper 的玩具,让中低级望而生畏,可能对一些应用场景也一 ...

  7. C#Windows Forms (Demo.SYS)--xdd

    private void Show_background_picture()//随机更换背景 { ";//默认值 Random ran = new Random(); , );//返回一个1 ...

  8. Sql server中用现有表中的数据创建Sql的Insert插入语句

    之前,在Codeproject发表过一篇关于用现有表中数据创建Insert的Sql语句的存储过程,今天将其搬到这里来,注意本存储过程仅适用于SQL SERVER. 介绍 一些时候,你想导出一些现有表中 ...

  9. 爬虫框架Scrapy入门——爬取acg12某页面

    1.安装1.1自行安装python3环境1.2ide使用pycharm1.3安装scrapy框架2.入门案例2.1新建项目工程2.2配置settings文件2.3新建爬虫app新建app将start_ ...

  10. JavaScript如何创建一个对象

    我们可以利用JavaScript的语法特征,以类的思想来创建对象. 方法一:原始方法代码如下: <script> var obj = new Object(); obj.name = &q ...