前言
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。(百度文库)
C#常用解析JSON方式
1.System.Runtime.Serialization(4.0.0.0)程序集中System.Runtime.Serialization.Json命名空间下的DataContractJsonSerializer类
public static class RuntimeSerializer
{
public static string SerializeObject(object obj)
{
using (MemoryStream ms = new MemoryStream())
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
serializer.WriteObject(ms, obj);
return System.Text.Encoding.UTF8.GetString(ms.ToArray());
}
}
public static T DeserializeObject<T>(string input)
{
using (MemoryStream ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(input)))
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
ms.Position = 0;
return (T)serializer.ReadObject(ms);
}
}
}
2.System.Web.Extensions(4.0.0.0)程序集中System.Web.Script.Serialization命名空间下的JavaScriptSerializer类
public static class NewtonsoftSerializer
{
public static string SerializeObject(object obj)
{
return Newtonsoft.Json.JsonConvert.SerializeObject(obj);
}
public static T DeserializeObject<T>(string input)
{
return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(input);
}
}
3.第三方工具Json.NET
Newtonsoft.Json程序集中Newtonsoft.Json命名空间下的JsonConverter类
Newtonsoft.Json.JsonConvert.SerializeObject(obj);
Newtonsoft.Json.JsonConvert.DeserializeObject<T>(input);
性能比较
测试数据对象
[DataContract]
public class Person
{
/// <summary>
/// 姓名
/// </summary>
[DataMember]
public string Name { get; set; }
/// <summary>
/// 身高
/// </summary>
[DataMember]
public double Height { get; set; }
/// <summary>
/// 性别
/// </summary>
[DataMember]
public SexType Sex { get; set; }
/// <summary>
/// 年龄
/// </summary>
[DataMember]
public short Age { get; set; }
/// <summary>
/// 出生日
/// </summary>
[DataMember]
public DateTime Birthday { get; set; }
/// <summary>
/// 是否成年
/// </summary>
[DataMember]
public Boolean IsAdult { get; set; }
}
用以下方法分别打印出三种常用解析方式序列化与反序列化的耗时
StringBuilder sb = new StringBuilder();
Person p = new Person() { Name = "张三", Age = 20, Birthday = DateTime.Now.AddYears(-20), Height = 1.62, Sex = SexType.Male };
List<string> stringList = new List<string>();
Stopwatch sw = new Stopwatch();
sw.Start();
for(int i = 0;i<1000;i++)
{
stringList.Add(RuntimeSerializer.SerializeObject(p)); // 此处调用序列化方法
}
sw.Stop();
sb.AppendLine(string.Format("RuntimeSerializer: serialize time {0}ms", sw.Elapsed.TotalMilliseconds));
sw.Restart();
foreach (string line in stringList)
{
RuntimeSerializer.DeserializeObject<Person>(line); // 此处调用反序列化方法
}
sw.Stop();
sb.AppendLine(string.Format("RuntimeSerializer: deserialize time {0}ms", sw.Elapsed.TotalMilliseconds));
显示运行结果与Json.NET官网给出的有比较大的出入。