欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.net core Json字符串的序列化和反序列化通用类源码,Newtonsoft和DataContractJsonSerializer性能对比

程序员文章站 2022-04-19 18:39:54
我们在开发中Json传输数据日益普遍,有很多关于Json字符串的序列化和反序列化的文章大多都告诉你怎么用,但是却不会告诉你用什么更高效。因为有太多选择,人们往往会陷入选择难题。 相比.NET Framework有三种选择而.net core下已经没有JavaScriptSerializer,但是大家 ......

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

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

datacontractjsonserializer

newtonsoft.json

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

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

.net core Json字符串的序列化和反序列化通用类源码,Newtonsoft和DataContractJsonSerializer性能对比

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

install-package newtonsoft.json -version 12.0.3-beta2

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

.net core Json字符串的序列化和反序列化通用类源码,Newtonsoft和DataContractJsonSerializer性能对比

#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>

五、那么看下效果吧。

.net core Json字符串的序列化和反序列化通用类源码,Newtonsoft和DataContractJsonSerializer性能对比

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

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