首页 新闻 会员 周边

json反序列化datatable的问题

0
悬赏园豆:20 [已关闭问题] 关闭于 2016-05-03 09:16

比如这样的json字符串[{"a":0},{"a":0.1}]

如果不定义实体类,反序列化为datatable结果就是

a

0

0

会丢失数据,有没有不自定义实体类但是又能保留精度的办法。这种情况太多,要是每个都去定义,太麻烦了。

清海扬波的主页 清海扬波 | 小虾三级 | 园豆:825
提问于:2016-04-29 09:24
< >
分享
所有回答(4)
1

你用什么反序列化的?

博学多思 | 园豆:76 (初学一级) | 2016-04-29 10:06

不管自己写的,还是Newtonsoft都是一样,好像默认都是按照第一行的解析。所以想强制指定类型。

支持(0) 反对(0) 清海扬波 | 园豆:825 (小虾三级) | 2016-04-29 10:10

@清海扬波: 好像默认都是按照第一行的解析是什么意思?

自定义实体类能保留精度的办法,怎么弄?

支持(0) 反对(0) 博学多思 | 园豆:76 (初学一级) | 2016-04-29 10:12

@博学多思: 自定义实体,就可以定义对应字段为decimal了,这样就没问题。但是这样的话,每个都得定义,工作量就大了。

支持(0) 反对(0) 清海扬波 | 园豆:825 (小虾三级) | 2016-04-29 10:15

@博学多思: 按照第一行解析的意思就是,我这json里面的2行内容,你换一下顺序在反序列化,结果就是对的。

支持(0) 反对(0) 清海扬波 | 园豆:825 (小虾三级) | 2016-04-29 10:16

@清海扬波: http://bbs.csdn.net/topics/390971682

这个有帮助啊?

支持(0) 反对(0) 博学多思 | 园豆:76 (初学一级) | 2016-04-29 10:19

@清海扬波: http://blog.csdn.net/sb1ue/article/details/6868082

支持(0) 反对(0) 博学多思 | 园豆:76 (初学一级) | 2016-04-29 10:22

@博学多思: 恩,跟我的问题一样,但是最后的解决办法也是要么定义实体类,要么定义表结构。要是有上百个功能要转,那。。。

支持(0) 反对(0) 清海扬波 | 园豆:825 (小虾三级) | 2016-04-29 10:24

@博学多思: 这些问题的根源就在于js把0.0,0.00这样的数字全部转成了0,反序列化的时候,就默认按照int64转,结果就会出问题。

支持(0) 反对(0) 清海扬波 | 园豆:825 (小虾三级) | 2016-04-29 10:27

@清海扬波: http://www.cnblogs.com/markli/p/4468889.html

这个可以啊?不可以的话,上别的地方问问吧

支持(0) 反对(0) 博学多思 | 园豆:76 (初学一级) | 2016-04-29 10:33

@博学多思: 还是一样的。

支持(0) 反对(0) 清海扬波 | 园豆:825 (小虾三级) | 2016-04-29 10:38

@清海扬波: 可以加个QQ啊

支持(0) 反对(0) 博学多思 | 园豆:76 (初学一级) | 2016-04-29 10:48
0

0.1用括号。

Supper_litt | 园豆:827 (小虾三级) | 2016-04-29 10:08

???????,在?

支持(0) 反对(0) 博学多思 | 园豆:76 (初学一级) | 2016-04-29 10:10

这是一列数字,怎么用括号?

支持(0) 反对(0) 清海扬波 | 园豆:825 (小虾三级) | 2016-04-29 10:10

@清海扬波: 说错了,是用引号。。。。

支持(0) 反对(0) Supper_litt | 园豆:827 (小虾三级) | 2016-04-29 10:12

@博学多思: 前面的,0也用引号。

支持(0) 反对(0) Supper_litt | 园豆:827 (小虾三级) | 2016-04-29 10:12

@Supper_litt: 数字,生成json都不会有引号的。

支持(0) 反对(0) 清海扬波 | 园豆:825 (小虾三级) | 2016-04-29 10:13
0

json字符串这样写 [{"a":'0'},{"a":'0.1'}]

小小高 | 园豆:1095 (小虾三级) | 2016-04-29 10:21

这样转换出来的是字符串而不是数字了。使用都会有问题。

支持(0) 反对(0) 清海扬波 | 园豆:825 (小虾三级) | 2016-04-29 10:25

@清海扬波: 生成datatable之后再处理不行么?不然的话就去改json.net的实现咯

支持(0) 反对(0) 小小高 | 园豆:1095 (小虾三级) | 2016-04-29 10:32

@小小高: 这样就会整个程序的数字都要处理了,我是想json.net有没有办法设置,所有的数字都按照double类型解析。这样就可以。

支持(0) 反对(0) 清海扬波 | 园豆:825 (小虾三级) | 2016-04-29 10:43
0
var json = "[{\"a\":0},{\"a\":0.1}]";
var jArray = JArray.Parse(json);
Console.WriteLine(jArray[1]["a"]);

 

jello chen | 园豆:7336 (大侠五级) | 2016-04-29 10:34

这样确实可以,那我怎么转换成datatable呢。

支持(0) 反对(0) 清海扬波 | 园豆:825 (小虾三级) | 2016-04-29 10:39

@清海扬波: 给你写个扩展,稍等

支持(0) 反对(0) jello chen | 园豆:7336 (大侠五级) | 2016-04-29 10:45

@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();
支持(0) 反对(0) jello chen | 园豆:7336 (大侠五级) | 2016-04-29 11:21

@jello chen: 谢谢,这样添加的所有列都是字符类型吧。

支持(0) 反对(0) 清海扬波 | 园豆:825 (小虾三级) | 2016-04-29 11:25

@清海扬波: 是的,如果你想精细控制的话,需要去改下这个扩展,传入一些setting进去

支持(0) 反对(0) jello chen | 园豆:7336 (大侠五级) | 2016-04-29 11:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册