我们在开发中json传输数据日益普遍,有很多关于json字符串的序列化和反序列化的文章大多都告诉你怎么用,但是却不会告诉你用什么更高效。因为有太多选择,人们往往会陷入选择难题。

相比.net framework有三种选择而.net core下已经没有javascriptserializer,但是大家还有两种选择分别如下:

datacontractjsonserializer

newtonsoft.json

因为这两个都有人用,所以我做了完整的对象转换demo进行了测试,这里我不仅和大家讲如何使用,并且还把我自己写的一个转换参与测试并告诉各位怎么测试的。为了节约开发时间,我们把解决方案收入到一个个demo中,方便以后即拿即用。而且这些demo有博客文档支持,帮助任何人非常容易上手开发跨平台的.net core。随着时间的推移,我们的demo库会日益强大请及时收藏github

在讲序列化及反序列化之前先把我们的测试结果分享给大家,十万数据测速比较告诉我们newtonsoft更高效。

一、首先在common公用项目中引用newtonsoft的类库

install-package newtonsoft.json -version 12.0.3-beta2

二、在common公用项目中添加commonhelper(这里大家想要的转换,根据需要自己拿吧)

#region model<->json(对象和json互转)
        #region datacontractjsonserializer
        public static string serializedatacontractjson<t>(t obj)
        {
            datacontractjsonserializer json = new datacontractjsonserializer(obj.gettype());
            using (memorystream stream = new memorystream())
            {
                json.writeobject(stream, obj);
                string szjson = encoding.utf8.getstring(stream.toarray());
                return szjson;
            }
        }
        public static t deserializedatacontractjson<t>(string szjson)
        {
            t obj = activator.createinstance<t>();
            using (memorystream ms = new memorystream(encoding.utf8.getbytes(szjson)))
            {
                datacontractjsonserializer serializer = new datacontractjsonserializer(obj.gettype());
                return (t)serializer.readobject(ms);
            }
        }
        #endregion

        #region newtonsoft
        static public string serializejson<t>(t data)
        {
            return newtonsoft.json.jsonconvert.serializeobject(data);
        }
        static public t deserializejson<t>(string json)
        {
            return newtonsoft.json.jsonconvert.deserializeobject<t>(json);
        }
        #endregion
        #endregion

        #region datatable<->json(datatable和json互转)
        public static string serializedatatabletojson(datatable dt)
        {
            return newtonsoft.json.jsonconvert.serializeobject(dt);
        }
        public static datatable serializejsontodatatable(string json)
        {
            return newtonsoft.json.jsonconvert.deserializeobject<datatable>(json);
        }
        #region 自己写datatable转json用于测试速度对比下
        public static string mydatatabletojson(datatable dt)
        {
            stringbuilder jsonstring = new stringbuilder();
            if (dt != null && dt.rows.count > 0)
            {
                jsonstring.append("{ ");
                jsonstring.append("\"tableinfo\":[ ");
                for (int i = 0; i < dt.rows.count; i++)
                {
                    jsonstring.append("{ ");
                    for (int j = 0; j < dt.columns.count; j++)
                    {
                        if (j < dt.columns.count - 1)
                        {
                            jsonstring.append("\"" + dt.columns[j].columnname.tostring() + "\":" + "\"" + dt.rows[i][j].tostring() + "\",");
                        }
                        else if (j == dt.columns.count - 1)
                        {
                            jsonstring.append("\"" + dt.columns[j].columnname.tostring() + "\":" + "\"" + dt.rows[i][j].tostring() + "\"");
                        }
                    }
                    if (i == dt.rows.count - 1)
                    {
                        jsonstring.append("} ");
                    }
                    else
                    {
                        jsonstring.append("}, ");
                    }
                }
                jsonstring.append("]}");
                return jsonstring.tostring();
            }
            else
            {
                return null;
            }
        }
        #endregion
        #endregion

 三、控制器添加json处理相应方法(我这里整合所有到了homecontroller下的json中了,你们不需要计时,用的时候只需要调用commonhelper的相关方法即可)

public iactionresult json()
        {
            list<article> articlelist = new list<article>();
            for (int x = 0; x < 100000; x++)
            {
                article article = new article();
                article.context = "内容:" + x;
                article.id = x + 1;
                article.createtime = datetime.now;
                article.title = "标题:" + x;
                articlelist.add(article);
            }

            #region 单个对象与json互转
            article articletest = new article();
            articletest.context = "内容";
            articletest.id = 1;
            articletest.createtime = datetime.now;
            articletest.title = "标题";
            string json11 = commonhelper.serializedatacontractjson(articletest);
            string json12 = commonhelper.serializejson(articletest);
            article article1 = commonhelper.deserializedatacontractjson<article>(json11);
            article article2 = commonhelper.deserializejson<article>(json12);
            #endregion

            #region 记录10万对象集合与json互转用时比较
            //serializedatacontractjson 10万对象转json
            system.diagnostics.stopwatch watch1 = new system.diagnostics.stopwatch();
            watch1.start();  //开始监视代码运行时间
            string json1 = commonhelper.serializedatacontractjson(articlelist); 
            timespan timespan1 = watch1.elapsed;  //获取当前实例测量得出的总时间
            watch1.stop();  //停止监视   
            viewbag.t1= timespan1.totalseconds;

            //newtonsoft 10万对象转json
            system.diagnostics.stopwatch watch2 = new system.diagnostics.stopwatch();
            watch2.start();  
            string json2 = commonhelper.serializejson(articlelist);
            timespan timespan2 = watch2.elapsed;  
            watch2.stop();
            viewbag.t2 = timespan2.totalseconds;

            //serializedatacontractjson 10万json转对象
            system.diagnostics.stopwatch watch3 = new system.diagnostics.stopwatch();
            watch3.start();  
            list<article> list1 = commonhelper.deserializedatacontractjson<list<article>>(json1);
            timespan timespan3 = watch3.elapsed; 
            watch3.stop();   
            viewbag.t3 = timespan3.totalseconds;

            //newtonsoft 10万json转对象
            system.diagnostics.stopwatch watch4 = new system.diagnostics.stopwatch();
            watch4.start();  
            list<article> list2 = commonhelper.deserializejson<list<article>>(json2);
            timespan timespan4 = watch4.elapsed;  
            watch4.stop();   
            viewbag.t4 = timespan4.totalseconds;

            #endregion

            #region 记录10万datatable与json互转用时比较
            datatable tbldatas = new datatable("datas");
            datacolumn dc = null;
            dc = tbldatas.columns.add("id", type.gettype("system.int32"));
            dc.autoincrement = true;//自动增加
            dc.autoincrementseed = 1;//起始为1
            dc.autoincrementstep = 1;//步长为1
            dc.allowdbnull = false;//

            dc = tbldatas.columns.add("product", type.gettype("system.string"));
            dc = tbldatas.columns.add("version", type.gettype("system.string"));
            dc = tbldatas.columns.add("description", type.gettype("system.string"));
            for (int x = 0; x < 100000; x++)
            {
                datarow newrow = tbldatas.newrow();
                newrow["product"] = "西游记" + x;
                newrow["version"] = "" + x;
                newrow["description"] = x;
                tbldatas.rows.add(newrow);
            }

            //newtonsoft 10万datatable转json
            system.diagnostics.stopwatch watch5 = new system.diagnostics.stopwatch();
            watch5.start();  
            string json5 = commonhelper.serializedatatabletojson(tbldatas);
            timespan timespan5 = watch5.elapsed;  
            watch5.stop(); 
            viewbag.t5 = timespan5.totalseconds;

            //newtonsoft 10万json转datatable
            system.diagnostics.stopwatch watch6 = new system.diagnostics.stopwatch();
            watch6.start();  
            datatable datatable = commonhelper.serializejsontodatatable(json5);
            timespan timespan6 = watch6.elapsed; 
            watch6.stop();  
            viewbag.t6 = timespan6.totalseconds;

            //自己写的  10万datatable转json
            system.diagnostics.stopwatch watch7 = new system.diagnostics.stopwatch();
            watch7.start();  
            string json7 = commonhelper.mydatatabletojson(tbldatas);
            timespan timespan7 = watch7.elapsed; 
            watch7.stop();    
            viewbag.t7 = timespan7.totalseconds;
            #endregion


            return view();
        }

四、前端设计(这里也没啥设计了,只是做了展示,代码我还是贴出来吧)

    <div style="width:80%;margin:auto;text-align:center;">
        <div class="cover" style="border: 1px solid #d6d6d6;padding: 5px;">
            <h2>10万对象与json互转</h2>
            <span>serializedatacontractjson:对象集合转json(@viewbag.t1 秒),json转对象集合(@viewbag.t3 秒)</span><br />
            <span>newtonsoft:对象集合转json(@viewbag.t2 秒),json转对象集合(@viewbag.t4 秒)</span>
        </div>
        <div class="cover" style="border: 1px solid #d6d6d6;padding: 5px;">
            <h2>10万datatable与json互转</h2>
            <span>newtonsoft:datatable转json(@viewbag.t5 秒),json转datatable(@viewbag.t6 秒)</span><br />
            <span>自己码:datatable转json(@viewbag.t7 秒)</span>
        </div>
    </div>

五、那么看下效果吧。

开源地址 动动小手,点个推荐吧!

注意:我们机遇屋该项目将长期为大家提供asp.net core各种好用demo,旨在帮助.net开发者提升竞争力和开发速度,建议尽早收藏该模板集合项目。