将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语言必须让程序员 ...
随机推荐
- shell编程-基础
1.linux 下 Bash 程序开 1.1 怎样写 shell 脚本 1.使用编辑工具编辑shell 脚本,例如 vim,脚本名字一般用.sh 为后缀,不用.sh 为后缀 时编辑的内容为全黑,不会有 ...
- 图片转换成base64预览
来源:https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader/readAsDataURL 真心不错写得,思路比较清晰.已经测试过 注意: ...
- PHP 发送get请求
PHP 发送get请求 file_get_contents 方法: $s = file_get_contents("http://apis.map.qq.com/ws/distance/v1 ...
- nyoj 24-素数距离问题 (素数算法)
24-素数距离问题 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:21 submit:71 题目描述: 现在给出你一些数,要求你写出一个程序,输出这 ...
- Cesium小插件改造--clock和timeline
一.Clock 废话不多说,先上效果图再说.如效果图所示:clock的日期显示为YY/MM/DD这种简洁明了格式,时间则为当前系统时间(也就是北京时间).Clock内部以儒略日(JulianDate) ...
- 十、CSR8670的DFU功能[补充]
前一篇转载的博文很清楚,全面的介绍了DFU功能的实现步骤.关于DFU功能,你还需要知道以下信息: 一.image.fs,firmware,loader,psr之间的关系 图1-1 image.fs示意 ...
- 搭建wordPress遇到无法连接数据库的问题
在确认了数据库用户,密码,地址都没有错的情况下,仍然出现无法连接数据库的问题,以至无法安装wordpress 我的wordpress:4.8.1-zh_CN 解决办法: 1.更改php的版本(我的改为 ...
- 攻克数通,斩获云计算!誉天Double HCIE学员考证秘笈揭晓
不知不觉,已经过了四个月的时间了,我是六月多报名云计算的,本来是奔着邹Sir去的,但是当时邹sir已经上到HCIE的课程了,只能蹭学弟之前的录屏看.等到七月八号,又正式跟了曾曦老师上了一次完整的课程. ...
- GitHub的高级搜索方式
平时在学完一个知识后,需要写些 demo来进行练手,这个时候 GitHub就是最好不过的资源库了,以下整理了一些关于在 github 上面找项目的一些小技巧. 一.单条件使用 项目名称 仓库名称包含 ...
- Python常见字符串方法函数
1.大小写转换 S.lower() S.upper() 前者将S字符串中所有大写字母转为小写,后者相反 S.title() S.capitalize() 前者返回S字符串中所有单词首字母大写且其他字母 ...