C#中的Json解析

前言

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官网给出的有比较大的出入。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值