我们知道在
NET中我们有多种对象序列化的方式
如XML方式序列化
Binary序列化
其中XML序列化是一种比较通用的在各语言之间传递数据的方式
除了这两种序列化方式之外
在
NET中还可以使用JSON序列化
JSON(JavaScript Object Notation)是一种轻量级轻量级的数据交换格式并且它独立于编程语言与XML序列化相比JSON序列化后产生的数据一般要比XML序列化后数据体积小所以在Facebook等知名网站中都采用了JSON作为数据交换方式在NET中有三种常用的JSON序列化的类分别是SystemWebScriptSerializationJavaScriptSerializer类SystemRuntimeSerializationJsonDataContractJsonSerializer类和NewtonsoftJsonJsonConvert类
为了便于下面的演示下面提供一个类的代码
[DataContract]
public class User
{
/// <summary>
/// 编号
/// </summary>
[DataMember]
public int UserId { get; set; }
/// <summary>
/// 用户名
/// </summary>
[DataMember]
public string UserName { get; set; }
/// <summary>
/// 创建时间
/// </summary>
[DataMember]
[JsonConverter(typeof(IsoDateTimeConverter))]
public DateTime CreateDate { get; set; }
/// <summary>
/// 生日
/// </summary>
[DataMember]
[JsonConverter(typeof(JavaScriptDateTimeConverter))]
public DateTime Birthday { get; set; }
/// <summary>
/// 相关URL
/// </summary>
[DataMember]
public List<string> Urls { get; set; }
/// <summary>
/// 薪水
/// </summary>
//[ScriptIgnore]//使用JavaScriptSerializer序列化时不序列化此字段
//[IgnoreDataMember]//使用DataContractJsonSerializer序列化时不序列化此字段
//[JsonIgnore]//使用JsonConvert序列化时不序列化此字段
public int Salary { get; set; }
/// <summary>
/// 权利级别
/// </summary>
[DataMember]
public Priority Priority { get; set; }
public User()
{
Urls = new List<string>()
}
}
/// <summary>
/// 权利级别
/// </summary>
public enum Priority:byte
{
Lowest=x
BelowNormal=x
Normal=x
AboveNormal=x
Highest=x
}
使用SystemWebScriptSerializationJavaScriptSerializer类
SystemWebScriptSerializationJavaScriptSerializer类是NET类库中自带的一种JSON序列化实现在NET Framework及以后版本中可以使用这个类这个类位于SystemWebExtensionsdll中使用这个类是必须添加对这个dll的引用
下面的代码是使用JavaScriptSerializer进行序列化和反序列化的例子
public static void JavaScriptSerializerDemo()
{
User user = new User { UserId = UserName = 李刚 CreateDate = DateTimeNowAddYears()Birthday=DateTimeNowAddYears() Priority = PriorityHighest Salary = };
//JavaScriptSerializer类在SystemWebExtensionsdll中注意添加这个引用
JavaScriptSerializer serializer = new JavaScriptSerializer()
//JSON序列化
string result=serializerSerialize(user)
ConsoleWriteLine(使用JavaScriptSerializer序列化后的结果{}长度{} result resultLength)
//JSON反序列化
user = serializerDeserialize<User>(result)
ConsoleWriteLine(使用JavaScriptSerializer反序列化后的结果UserId:{}UserName:{}CreateDate:{}Priority:{} userUserId userUserName userCreateDate userPriority)
}
说明如果不想序列化某个字段可以在字段前面加[JsonIgnore]标记
使用SystemRuntimeSerializationJsonDataContractJsonSerializer类
SystemRuntimeSerializationJsonDataContractJsonSerializer类位于SystemServiceModelWebdll中使用这个类时除了需要添加对SystemServiceModelWebdll的引用之外还需要添加SystemRuntimeSerializationdll的引用注意这个类也是在NET Framework及以后版本中可以使用
下面是使用DataContractJsonSerializer类的例子
public static void DataContractJsonSerializerDemo()
{
User user = new User { UserId = UserName = 李刚 CreateDate = DateTimeNowAddYears() Birthday = DateTimeNowAddYears() Priority = PriorityAboveNormal Salary = };
string result = stringEmpty;
//DataContractJsonSerializer类在SystemServiceModelWebdll中注意添加这个引用
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(User))
using (MemoryStream stream = new MemoryStream())
{
//JSON序列化
serializerWriteObject(stream user)
result = EncodingUTFGetString(streamToArray())
ConsoleWriteLine(使用DataContractJsonSerializer序列化后的结果{}长度{} result resultLength)
}
//JSON反序列化
byte[] buffer = EncodingUTFGetBytes(result)
using (MemoryStream stream = new MemoryStream(buffer))
{
user = serializerReadObject(stream) as User;
ConsoleWriteLine(使用DataContractJsonSerializer反序列化后的结果UserId:{}UserName:{}CreateDate:{}Priority:{} userUserId userUserName userCreateDate userPriority)
}
}
注意要使用DataContractJsonSerializer类进行序列化和反序列化必须给类加上[DataContract]属性对要序列化的字段加上[DataMember]属性如果不想序列化某个字段或者属性可以加上[IgnoreDataMember]属性
使用NewtonsoftJsonJsonConvert类
NewtonsoftJsonJsonConvert类是非微软提供的一个JSON序列化和反序列的开源免费的类库(下载网址是)它提供了更灵活的序列化和反序列化控制并且如果你的开发环境使用的是NET Framework及以后版本的话你就可以使用Linq to JSON这样一来面对一大段的数据不必一一解析你可以使用Linq to JSON解析出你关心的那部分即可非常方便
下面是使用NewtonsoftJsonJsonConvert类的例子
public static void JsonConvertDemo()
{
User user = new User { UserId = UserName = 李刚 CreateDate = DateTimeNowAddYears() Birthday = DateTimeNowAddYears() Priority = PriorityBelowNormal Salary = };
//JsonConvert类在NewtonsoftJsonNetdll中注意到下载这个dll并添加这个引用
//JSON序列化
string result = JsonConvertSerializeObject(user)
ConsoleWriteLine(使用JsonConvert序列化后的结果{}长度{} result resultLength)
//JSON反序列化
user = JsonConvertDeserializeObject<User>(result)
ConsoleWriteLine(使用JsonConvert反序列化后的结果UserId:{}UserName:{}CreateDate:{}Priority:{} userUserId userUserName userCreateDate userPriority)
}
public static void JsonConvertLinqDemo()
{
User user = new User { UserId = UserName = 周公 CreateDate = DateTimeNowAddYears() Birthday = DateTimeNowAddYears() Priority = PriorityLowest Salary = Urls = new List<string> { } };
//JsonConvert类在NewtonsoftJsonNetdll中注意到下载这个dll并添加这个引用
//JSON序列化
string result = JsonConvertSerializeObject(user)
ConsoleWriteLine(使用JsonConvert序列化后的结果{}长度{} result resultLength)
//使用Linq to JSON
JObject jobject = JObjectParse(result)
JToken token = jobject[Urls];
List<string> urlList = new List<string>()
foreach (JToken t in token)
{
urlListAdd(tToString())
}
ConsoleWrite(使用Linq to JSON反序列化后的结果[)
for (int i = ; i < urlListCount ;i++ )
{
ConsoleWrite(urlList[i] + )
}
ConsoleWriteLine(urlList[urlListCount ] + ])
}
注意如果有不需要序列化的字段可以给该字段添加[JsonIgnore]标记在Newtonsoft这个类库中对于日期的序列化有多种方式可以类的DataTime成员添加上对应的标记这样在进行序列化和反序列化时就会按照指定的方式进行在本例中User类的CreateDate属性添加的属性是[JsonConverter(typeof(IsoDateTimeConverter))]而Birthday属性添加的属性是[JsonConverter(typeof(JavaScriptDateTimeConverter))]从序列化的结果可以看出来它们最终的表现形式并不一样
本文中所有的示例代码如下
using System;
using SystemCollectionsGeneric;
using SystemLinq;
using SystemText;
using SystemWebScriptSerialization;
using SystemRuntimeSerializationJson;
using SystemIO;
using SystemRuntimeSerialization;
using NewtonsoftJson;
using NewtonsoftJsonLinq;
using NewtonsoftJsonConverters;
namespace JSONDemo
{
class Program
{
static void Main(string[] args)
{
JavaScriptSerializerDemo()
DataContractJsonSerializerDemo()
JsonConvertDemo()
JsonConvertLinqDemo()
ConsoleReadLine()
}
public static void JavaScriptSerializerDemo()
{
User user = new User { UserId = UserName = 李刚 CreateDate = DateTimeNowAddYears()Birthday=DateTimeNowAddYears() Priority = PriorityHighest Salary = };
//JavaScriptSerializer类在SystemWebExtensionsdll中注意添加这个引用
JavaScriptSerializer serializer = new JavaScriptSerializer()
//JSON序列化
string result=serializerSerialize(user)
ConsoleWriteLine(使用JavaScriptSerializer序列化后的结果{}长度{} result resultLength)
//JSON反序列化
user = serializerDeserialize<User>(result)
ConsoleWriteLine(使用JavaScriptSerializer反序列化后的结果UserId:{}UserName:{}CreateDate:{}Priority:{} userUserId userUserName userCreateDate userPriority)
}
public static void DataContractJsonSerializerDemo()
{
User user = new User { UserId = UserName = 李刚 CreateDate = DateTimeNowAddYears() Birthday = DateTimeNowAddYears() Priority = PriorityAboveNormal Salary = };
string result = stringEmpty;
//DataContractJsonSerializer类在SystemServiceModelWebdll中注意添加这个引用
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(User))
using (MemoryStream stream = new MemoryStream())
{
//JSON序列化
serializerWriteObject(stream user)
result = EncodingUTFGetString(streamToArray())
ConsoleWriteLine(使用DataContractJsonSerializer序列化后的结果{}长度{} result resultLength)
}
//JSON反序列化
byte[] buffer = EncodingUTFGetBytes(result)
using (MemoryStream stream = new MemoryStream(buffer))
{
user = serializerReadObject(stream) as User;
ConsoleWriteLine(使用DataContractJsonSerializer反序列化后的结果UserId:{}UserName:{}CreateDate:{}Priority:{} userUserId userUserName userCreateDate userPriority)
}
}
public static void JsonConvertDemo()
{
User user = new User { UserId = UserName = 李刚 CreateDate = DateTimeNowAddYears() Birthday = DateTimeNowAddYears() Priority = PriorityBelowNormal Salary = };
//JsonConvert类在NewtonsoftJsonNetdll中注意到下载这个dll并添加这个引用
//JSON序列化
string result = JsonConvertSerializeObject(user)
ConsoleWriteLine(使用JsonConvert序列化后的结果{}长度{} result resultLength)
//JSON反序列化
user = JsonConvertDeserializeObject<User>(result)
ConsoleWriteLine(使用JsonConvert反序列化后的结果UserId:{}UserName:{}CreateDate:{}Priority:{} userUserId userUserName userCreateDate userPriority)
}
public static void JsonConvertLinqDemo()
{
User user = new User { UserId = UserName = 周公 CreateDate = DateTimeNowAddYears() Birthday = DateTimeNowAddYears() Priority = PriorityLowest Salary = Urls = new List<string> { } };
//JsonConvert类在NewtonsoftJsonNetdll中注意到下载这个dll并添加这个引用
//JSON序列化
string result = JsonConvertSerializeObject(user)
ConsoleWriteLine(使用JsonConvert序列化后的结果{}长度{} result resultLength)
//使用Linq to JSON
JObject jobject = JObjectParse(result)
JToken token = jobject[Urls];
List<string> urlList = new List<string>()
foreach (JToken t in token)
{
urlListAdd(tToString())
}
ConsoleWrite(使用Linq to JSON反序列化后的结果[)
for (int i = ; i < urlListCount ;i++ )
{
ConsoleWrite(urlList[i] + )
}
ConsoleWriteLine(urlList[urlListCount ] + ])
}
}
[DataContract]
public class User
{
/// <summary>
/// 编号
/// </summary>
[DataMember]
public int UserId { get; set; }
/// <summary>
/// 用户名
/// </summary>
[DataMember]
public string UserName { get; set; }
/// <summary>
/// 创建时间
/// </summary>
[DataMember]
[JsonConverter(typeof(IsoDateTimeConverter))]
public DateTime CreateDate { get; set; }
/// <summary>
/// 生日
/// </summary>
[DataMember]
[JsonConverter(typeof(JavaScriptDateTimeConverter))]
public DateTime Birthday { get; set; }
/// <summary>
/// 相关URL
/// </summary>
[DataMember]
public List<string> Urls { get; set; }
/// <summary>
/// 薪水
/// </summary>
[ScriptIgnore]//使用JavaScriptSerializer序列化时不序列化此字段
[IgnoreDataMember]//使用DataContractJsonSerializer序列化时不序列化此字段
[JsonIgnore]//使用JsonConvert序列化时不序列化此字段
public int Salary { get; set; }
/// <summary>
/// 权利级别
/// </summary>
[DataMember]
public Priority Priority { get; set; }
public User()
{
Urls = new List<string>()
}
}
/// <summary>
/// 权利级别
/// </summary>
public enum Priority:byte
{
Lowest=x
BelowNormal=x
Normal=x
AboveNormal=x
Highest=x
}
}
程序的运行结果如下
[xhtml]
使用JavaScriptSerializer序列化后的结果{UserId:UserName:李刚CreateDate://Date()//Birthday://Date()//Urls:[]Priority:}长度
使用JavaScriptSerializer反序列化后的结果UserId:UserName:李刚CreateDate: ::Priority:Highest
使用DataContractJsonSerializer序列化后的结果{Birthday://Date(+)//CreateDate://Date(+)//Priority:Urls:[]UserId:UserName:李刚}长度
使用DataContractJsonSerializer反序列化后的结果UserId:UserName:李刚CreateDate: ::Priority:AboveNormal
使用JsonConvert序列化后的结果{UserId:UserName:李刚CreateDate:T::+:Birthday:new Date()Urls:[]Priority:}长度
使用JsonConvert反序列化后的结果UserId:UserName:李刚CreateDate: ::Priority:BelowNormal
使用JsonConvert序列化后的结果{UserId:UserName:周公CreateDate:T::+:Birthday:new Date()Urls:[]Priority:}长度
使用Linq to JSON反序列化后的结果[]
总结通过上面的例子大家可以看出Newtonsoft类库提供的JSON序列化和反序列的方式更加灵活在实际开发中周公也一直使用Newtonsoft作为JSON序列化和反序列化的不二选择