我们在开发中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开发者提升竞争力和开发速度,建议尽早收藏该模板集合项目

.net core Json字符串的序列化和反序列化通用类源码,并模拟了10万数据对比DataContractJsonSerializer和Newtonsoft性能的更多相关文章

  1. c# .net 读取json 字符串 与序列化和反序列化json字符串

    命名空间 using Newtonsoft.Json.Linq; JObject obj = JObject.Parse("json字符串");用 obj["" ...

  2. C#中json字符串的序列化和反序列化

    改文章转自:https://www.cnblogs.com/shang201215019/p/7907655.html 什么是 Json ?        Json[javascript对象表示方法] ...

  3. C#将JSON字符串对象序列化与反序列化

    C#将对象序列化成JSON字符串 public string GetJsonString() { List<Product> products = new List<Product& ...

  4. com.google.gson json字符串的序列化与反序列化

    经常做协议的时候用到json,个人习惯是定义协议文档,很少在这中场景中定义类,使用对象. 这里使用一个人物有名字,性别,有一个物品列表做个简单示例记录. 序列化 JsonObject jo=new J ...

  5. 使用Newtonsoft.Json序列化和反序列化对象(源码)

    Json数据格式,简单而强大. 使用Json,不得不提到Newtonsoft.Json,它帮助我们更方便的使用Json,当然,不使用它也是可以的,还有许多方法将对象序列化成Json字符串,暂且不提. ...

  6. .net MVC 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错,字符串的长度超过了为 maxJsonLength 属性设置的值

    在.net mvc的controller中,方法返回JsonResult,一般我们这么写: [HttpPost] public JsonResult QueryFeature(string url, ...

  7. 使用JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength属性

    "/"应用程序中的服务器错误.使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错.字符串的长度超过了为 maxJsonLength 属性设置的值. ...

  8. JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength 属性设置的值

    在.net mvc的controller中,方法返回JsonResult,一般我们这么写:   [HttpPost]   public JsonResult QueryFeature(string u ...

  9. 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错

    如题 报错提示: 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错.字符串的长度超过了为 maxJsonLength 属性设置的值.","Sta ...

随机推荐

  1. synchronized块中的wait()、nofity()、nofityAll()方法

    前言 在Java并发编程实战,会经常遇到多个线程访问同一个资源的情况,这个时候就需要维护数据的一致性,否则会出现各种数据错误,其中一种同步方式就是利用Synchronized关键字执行锁机制,锁机制是 ...

  2. Java集合总结—再也不怕面试问到集合了

    Java集合总结 1.常见的集合 Map接口和Collection接口是所有集合框架的父接口: Collection接口的子接口包括:Set接口和List接口 Map接口的实现类主要有:HashMap ...

  3. Redis开发与运维:数据迁移(下)

    上一篇,有朋友留言redis-port,借此机会我尝试使用一下redis-port这个同步工具 redis-port 已编译版 https://github.com/CodisLabs/redis-p ...

  4. Jenkins部署(基于Linux)

    1.安装JDK  我不列出来了,自行百度 java -version 2.安装tomcat (1)创建目录tomcat8 (2)导入tomcat文件到tomcat8目录中并解压 (3)启动tomcat ...

  5. API---注册表编程

    首先来认识一下键,项,值吧: 左边有五个根键: HKEY_CLASSES_ROOT HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USER HKEY_CURREN ...

  6. 3、Struts2的API访问和数据封装

    一.API的访问 在使用Struts2的框架的过程中,发现Struts2和Servlet的API是解耦合的.在实际开发中,经常使用到Servlet的API,比如进行登录,将用户的信息保存到Sessio ...

  7. PostgreSQL使用安装

    PostgreSQL使用安装 一. 安装 ubuntu安装: # 安装客户端 sudo apt-get install postgresql-client # 安装服务器 sudo apt-get i ...

  8. Sentinel Getting Started And Integration of Spring Cloud Alibaba Tutorials

    原文链接:Sentinel Getting Started And Integration of Spring Cloud Alibaba Tutorials Sentinel Getting Sta ...

  9. 使用 Helm Chart 部署及卸载 istio

    部署 istio 1.添加 istio 官方的 helm 仓库 helm repo add istio https://storage.googleapis.com/istio-release/rel ...

  10. Dispatcher与UI线程交互

    this.chart2.Dispatcher.BeginInvoke(new Action(() => { this.chart2.SetData("Series1", lx ...