C# Json的序列化和反序列化的三种方式总结
2020-10-12 本文已影响0人
NewForMe
在C#中使用JSON的序列化和反序列化主要有三种方式:
1.使用DataContractJsonSerializer类
2.使用JavaScriptSerializer类
3.使用JSON.NET类库
我们先来看看使用 DataContractJsonSerializer的情况
DataContractJsonSerializer类帮助我们序列化和反序列化Json,他在程序集 System.Runtime.Serialization.dll下的System.Runtime.Serialization.Json命名空间里。
此方法常用于在一些旧版本的.net框架中,如3.0,3.5等。
创建一个JSON帮助类
using System.IO;
using System.Runtime.Serialization.Json;
using System.Text;
namespace Dockty.Data
{
public static class JsonHelper<T>
{
static JsonHelper()
{ }
/// <summary>
/// 序列化为JSON对象
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static string WriteObject(T obj)
{
var serializer = new DataContractJsonSerializer(typeof(T));
var mstream = new MemoryStream();
serializer.WriteObject(mstream, obj);
byte[] Bytes = new byte[mstream.Length];
mstream.Position = 0;
mstream.Read(Bytes, 0, (int)mstream.Length);
return Encoding.UTF8.GetString(Bytes);
}
/// <summary>
/// JSON对象反序列化
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static T ReadObject(string data)
{
var mstream = new MemoryStream(Encoding.UTF8.GetBytes(data));
var serializer = new DataContractJsonSerializer(typeof(T));
return (T)serializer.ReadObject(mstream);
}
}
}
使用
ArtTags tags = new ArtTags() { ArtID = 1, ID = 1, TagID = 1 };
//序列化
string strTags = JsonHelper<ArtTags>.WriteObject(tags);
//反序列化
ArtTags newTags = JsonHelper<ArtTags>.ReadObject(strTags);
再看看使用JavaScriptJsonSerializer的情况:
//-----------------------------------------------------------------------------------------
//使用JavaScriptSerializer方式需要引入的命名空间,这个在程序集System.Web.Extensions.dll.中
using System.Web.Script.Serialization;
//----------------------------------------------------------------------------------------
#region 2.JavaScriptSerializer方式实现序列化和反序列化
Student stu = new Student()
{
ID = 1,
Name = "关羽",
Age = 2000,
Sex = "男"
};
JavaScriptSerializer js = new JavaScriptSerializer();
string jsonData = js.Serialize(stu);//序列化
Console.WriteLine(jsonData);
////反序列化方式一:
string desJson = jsonData;
//Student model = js.Deserialize<Student>(desJson);// //反序列化
//string message = string.Format("ID={0},Name={1},Age={2},Sex={3}", model.ID, model.Name, model.Age, model.Sex);
//Console.WriteLine(message);
//Console.ReadKey();
////反序列化方式2
dynamic modelDy = js.Deserialize<dynamic>(desJson); //反序列化
string messageDy = string.Format("动态的反序列化,ID={0},Name={1},Age={2},Sex={3}",
modelDy["ID"], modelDy["Name"], modelDy["Age"], modelDy["Sex"]);//这里要使用索引取值,不能使用对象.属性
Console.WriteLine(messageDy);
Console.ReadKey();
#endregion
最后看看使用JSON.NET的情况,引入类库(推荐使用):
//使用Json.NET类库需要引入的命名空间
//-----------------------------------------------------------------------------
using Newtonsoft.Json;
//-------------------------------------------------------------------------
#region 3.Json.NET序列化
List<Student> lstStuModel = new List<Student>()
{
new Student(){ID=1,Name="张飞",Age=250,Sex="男"},
new Student(){ID=2,Name="潘金莲",Age=300,Sex="女"}
};
//Json.NET序列化
string jsonData = JsonConvert.SerializeObject(lstStuModel);
Console.WriteLine(jsonData);
Console.ReadKey();
//Json.NET反序列化
string json = @"{ 'Name':'C#','Age':'3000','ID':'1','Sex':'女'}";
Student descJsonStu = JsonConvert.DeserializeObject<Student>(json);//反序列化
Console.WriteLine(string.Format("反序列化: ID={0},Name={1},Sex={2},Sex={3}", descJsonStu.ID, descJsonStu.Name, descJsonStu.Age, descJsonStu.Sex));
Console.ReadKey();
#endregion
总结:
在使用的简洁性及性能来看都是最后一种方法是最好的,不过有时我们面向使用一些非常古老的项目的时候就可能需要使用到第一种方法DataContractJsonSerializer。