需求:

数据库使用飘雪算法保存唯一标识  是一个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. shell编程-基础

    1.linux 下 Bash 程序开 1.1 怎样写 shell 脚本 1.使用编辑工具编辑shell 脚本,例如 vim,脚本名字一般用.sh 为后缀,不用.sh 为后缀 时编辑的内容为全黑,不会有 ...

  2. 图片转换成base64预览

    来源:https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader/readAsDataURL 真心不错写得,思路比较清晰.已经测试过 注意: ...

  3. PHP 发送get请求

    PHP 发送get请求 file_get_contents 方法: $s = file_get_contents("http://apis.map.qq.com/ws/distance/v1 ...

  4. nyoj 24-素数距离问题 (素数算法)

    24-素数距离问题 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:21 submit:71 题目描述: 现在给出你一些数,要求你写出一个程序,输出这 ...

  5. Cesium小插件改造--clock和timeline

    一.Clock 废话不多说,先上效果图再说.如效果图所示:clock的日期显示为YY/MM/DD这种简洁明了格式,时间则为当前系统时间(也就是北京时间).Clock内部以儒略日(JulianDate) ...

  6. 十、CSR8670的DFU功能[补充]

    前一篇转载的博文很清楚,全面的介绍了DFU功能的实现步骤.关于DFU功能,你还需要知道以下信息: 一.image.fs,firmware,loader,psr之间的关系 图1-1 image.fs示意 ...

  7. 搭建wordPress遇到无法连接数据库的问题

    在确认了数据库用户,密码,地址都没有错的情况下,仍然出现无法连接数据库的问题,以至无法安装wordpress 我的wordpress:4.8.1-zh_CN 解决办法: 1.更改php的版本(我的改为 ...

  8. 攻克数通,斩获云计算!誉天Double HCIE学员考证秘笈揭晓

    不知不觉,已经过了四个月的时间了,我是六月多报名云计算的,本来是奔着邹Sir去的,但是当时邹sir已经上到HCIE的课程了,只能蹭学弟之前的录屏看.等到七月八号,又正式跟了曾曦老师上了一次完整的课程. ...

  9. GitHub的高级搜索方式

    平时在学完一个知识后,需要写些 demo来进行练手,这个时候 GitHub就是最好不过的资源库了,以下整理了一些关于在 github 上面找项目的一些小技巧. 一.单条件使用 项目名称 仓库名称包含 ...

  10. Python常见字符串方法函数

    1.大小写转换 S.lower() S.upper() 前者将S字符串中所有大写字母转为小写,后者相反 S.title() S.capitalize() 前者返回S字符串中所有单词首字母大写且其他字母 ...