比如这样的json字符串[{"a":0},{"a":0.1}]
如果不定义实体类,反序列化为datatable结果就是
a
0
0
会丢失数据,有没有不自定义实体类但是又能保留精度的办法。这种情况太多,要是每个都去定义,太麻烦了。
你用什么反序列化的?
不管自己写的,还是Newtonsoft都是一样,好像默认都是按照第一行的解析。所以想强制指定类型。
@清海扬波: 好像默认都是按照第一行的解析是什么意思?
自定义实体类能保留精度的办法,怎么弄?
@博学多思: 自定义实体,就可以定义对应字段为decimal了,这样就没问题。但是这样的话,每个都得定义,工作量就大了。
@博学多思: 按照第一行解析的意思就是,我这json里面的2行内容,你换一下顺序在反序列化,结果就是对的。
@清海扬波: http://bbs.csdn.net/topics/390971682
这个有帮助啊?
@清海扬波: http://blog.csdn.net/sb1ue/article/details/6868082
@博学多思: 恩,跟我的问题一样,但是最后的解决办法也是要么定义实体类,要么定义表结构。要是有上百个功能要转,那。。。
@博学多思: 这些问题的根源就在于js把0.0,0.00这样的数字全部转成了0,反序列化的时候,就默认按照int64转,结果就会出问题。
@清海扬波: http://www.cnblogs.com/markli/p/4468889.html
这个可以啊?不可以的话,上别的地方问问吧
@博学多思: 还是一样的。
@清海扬波: 可以加个QQ啊
0.1用括号。
???????,在?
这是一列数字,怎么用括号?
@清海扬波: 说错了,是用引号。。。。
@博学多思: 前面的,0也用引号。
@Supper_litt: 数字,生成json都不会有引号的。
json字符串这样写 [{"a":'0'},{"a":'0.1'}]
这样转换出来的是字符串而不是数字了。使用都会有问题。
@清海扬波: 生成datatable之后再处理不行么?不然的话就去改json.net的实现咯
@小小高: 这样就会整个程序的数字都要处理了,我是想json.net有没有办法设置,所有的数字都按照double类型解析。这样就可以。
var json = "[{\"a\":0},{\"a\":0.1}]"; var jArray = JArray.Parse(json); Console.WriteLine(jArray[1]["a"]);
这样确实可以,那我怎么转换成datatable呢。
@清海扬波: 给你写个扩展,稍等
@jello chen:
public static class JArrayExtensions { public static DataTable ToDataTable(this JArray jArray) { if (jArray == null) throw new ArgumentNullException("jArray"); var dataTable = new DataTable(); if(jArray.Count > 0) { var jObject = jArray[0] as JObject; if(jObject != null) { foreach (dynamic token in jObject.AsJEnumerable()) { var tokenName = token.Name; dataTable.Columns.Add(tokenName); } foreach (var jObjectToken in jArray.AsEnumerable()) { foreach (dynamic item in jObjectToken.AsEnumerable()) { if(dataTable.Columns.Contains(item.Name)) { var dr = dataTable.NewRow(); dr[item.Name] = item.Value; dataTable.Rows.Add(dr); } } } } } return dataTable; } }
使用方法:
var json = "[{\"a\":0},{\"a\":0.1}]"; var jArray = JArray.Parse(json); var dt = jArray.ToDataTable();
@jello chen: 谢谢,这样添加的所有列都是字符类型吧。
@清海扬波: 是的,如果你想精细控制的话,需要去改下这个扩展,传入一些setting进去