.net core Json字符串的序列化和反序列化通用类源码,Newtonsoft和DataContractJsonSerializer性能对比
我们在开发中json传输数据日益普遍,有很多关于json字符串的序列化和反序列化的文章大多都告诉你怎么用,但是却不会告诉你用什么更高效。因为有太多选择,人们往往会陷入选择难题。
相比.net framework有三种选择而.net core下已经没有javascriptserializer,但是大家还有两种选择分别如下:
因为这两个都有人用,所以我做了完整的对象转换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开发者提升竞争力和开发速度,建议尽早收藏该模板集合项目。
上一篇: 用XMLHTTP很好的一个例子