zoukankan      html  css  js  c++  java
  • .NET Framewok 3.5 中 JSON 序列化和反序列化的简单实现

    JSON 序列化和反序列化实例:

    由于JSON对象在数据交换中越来越流行,.NET Framewok 3.5也提供了JSON对象序列化和反序列化的类,这就是System.Runtime.Serialization.Json 命名空间下的 DataContractJsonSerializer 类。利用这个类,可以实现JSON对象的序列化和反序列化。

    下面演示如何使用 DataContractJsonSerializer 序列化和反序列化 JavaScript Object Notation (JSON) 格式的数据。此序列化引擎将 JSON 数据转换为 .NET Framework 类型的实例,然后重新转换为 JSON 数据。DataContractJsonSerializer 支持的类型与 DataContractSerializer 相同。JSON 数据格式在编写异步 JavaScript 和 XML (AJAX) 样式的 Web 应用程序时特别有用。Windows Communication Foundation (WCF) 对 AJAX 的支持经过了优化,以便通过 ScriptManager 控件与 ASP.NET AJAX 一起使用。

    例子代码如下:

    新建一个asp.net 的website

    说明:此示例需要安装 .NET Framework 3.5 版才能生成和运行。若要打开项目和解决方案文件,需要使用 Visual Studio 2008。

    在default.aspx页面,编写HTML 代码如下:

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        
    <title></title>
    </head>
    <body>
        
    <form id="form1" runat="server">
        
    <div>
          
    <asp:Button ID="Button_1" Text="JSON序列化" runat="server" Width="80" Height="24"  onclick="Button_1_Click" />
            
    <br />
            
    <asp:Label ID="JsonString" runat="server" Text="【你将得到序列化的字符串】"></asp:Label>
            
    <br />
            
    <br />
          
    <asp:Button ID="Button_2" Text="JSON反序列化" runat="server" Width="100" Height="24" onclick="Button_2_Click" />
               
    <br />
            
    <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
        
    </div>
        
    </form>
    </body>
    </html>

    后置代码如下:

    public partial class _Default : System.Web.UI.Page
    {
        
    protected void Page_Load(object sender, EventArgs e)
        {

        }

        
    //对象的序列化
        protected void Button_1_Click(object sender, EventArgs e)
        {
            Employee emp 
    = new Employee()
            {
                Name 
    = "Jack Dong",
                Address 
    = "北京海淀区翠宫大厦"
            };

            
    string strJSON = ToJson<Employee>(emp);//Encoding.Unicode.GetString(mstream.ToArray());
            
    //Response.Write(strJSON);
            JsonString.Text = strJSON;
        }

        
    protected void Button_2_Click(object sender, EventArgs e)
        {
            String strJSON 
    = "{\"Name\":\"Besson Kack\",\"Address\":\"上海大学研究生公寓\"}";
            Employee em 
    = Deserialize<Employee>(strJSON);

            Response.Write(
    "反序列化后Employe实体对象的属性值:Name=<font style='font-weight:blod;'>" + em.Name + "</font>");
        }

        
    private string ToJson<T>(T obj)
        {
            DataContractJsonSerializer ds 
    = new DataContractJsonSerializer(typeof(T));
            MemoryStream ms 
    = new MemoryStream();
            ds.WriteObject(ms, obj);
            
    string strJSON = Encoding.UTF8.GetString(ms.ToArray());
            ms.Close();
            
    return strJSON;
        }

        
    private T Deserialize<T>(string sJson) where T : class
        {
            DataContractJsonSerializer ds 
    = new DataContractJsonSerializer(typeof(T));
            MemoryStream ms 
    = new MemoryStream(Encoding.UTF8.GetBytes(sJson));
            T obj 
    = (T)ds.ReadObject(ms);

            ms.Close();
            
    return obj;
        }
    }

    [DataContract]
    public class Employee
    {
        [DataMember]
        
    public string Name { getset; }

        [DataMember]
        
    public string Address { getset; }
    }

    此示例使用 Employee对象 数据协定演示序列化反序列化

    (1)先看反序列化,由JSON 数据反序列化为对象(这里是Employee)。然后重绕流并调用 ReadObject。

            JSON数据{"Address":"北京海淀区卫星大厦 西思艾北京软件","Name":"Jack Dong"}

    (2)若要将 Employee类型的实例序列化为 JSON,首先创建 DataContractJsonSerializer 并使用 WriteObject 方法将 JSON 数据编写成流。

            见代码中的泛型方法(ToJson<T>,这里将其抽象成一个通用JSON序列化Function,其实你可以适当做些修改,定义一个接口如IJson,哪怕这个接口内部什么也没有定义,然后基于接口使用扩展方法,定义一个通用序列化类,实现类型JSON序列化和反序列化,同时还可以定义一个深度克隆类型的方法)如下定义:

    //空接口
    public interface IJson
    {
    }

    public static class JsonHelper
    {
        
    public static string ToJson(this IJson source)
        {
            
    return ToJson(source, source.GetType());
        }

        
    public static string ToJson(this IJson source, Type type)
        {
            DataContractJsonSerializer serilializer 
    = new DataContractJsonSerializer(type);
            
    using (Stream stream = new MemoryStream())
            {
                serilializer.WriteObject(stream, source);
                stream.Flush();
                stream.Position 
    = 0;
                StreamReader reader 
    = new StreamReader(stream);
                
    return reader.ReadToEnd();
            }
        }

        
    public static T ParseJSON<T>(this string str)
        {
            
    using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(str)))
            {
                DataContractJsonSerializer serializer 
    = new DataContractJsonSerializer(typeof(T));
                
    return (T)serializer.ReadObject(ms);
            }
        }

        
    // 通过JSON序列化深度克隆类型
        public static T DeepClone<T>(this IJson Source) where T : IJson
        {
            
    string jsonString = Source.ToJson();
            
    return jsonString.ParseJSON<T>();
        }
    }

    在进行代码测试时,注意添加引用System.Runtime.Serialization和System.Runtime.Serialization.Json

    “数据协定”是在服务与客户端之间达成的正式协议,用于以抽象方式描述要交换的数据。 也就是说,为了进行通信,客户端和服务不必共享相同的类型,而只需共享相同的数据协定。 数据协定为每个参数或返回类型精确定义为进行交换而序列化(转换为 XML)哪些数据。所有 .NET Framework 基元类型(如整型和字符串型)以及某些被视为基元的类型(如 DateTime 和 XmlElement)无需做其他任何准备工作就可序列化并被视为拥有默认数据协定。 许多 .NET Framework 类型也具有现有数据协定。 必须为所创建的新复杂类型定义数据协定以便可以进行序列化。 正常情况下可通过将 DataContractAttribute 属性应用到该类型来完成该任务。 可以将此属性应用到类、结构和枚举。 然后必须将 DataMemberAttribute 属性应用到数据协定类型的每个成员,以指示这些成员为数据成员,即应进行序列化。

    DataMemberAttribute 类:当应用于类型的成员时,指定该成员是数据协定的一部分并可由 DataContractSerializer 进行序列化。

    DataContractAttribute 类:指定该类型要定义或实现一个数据协定,并可由序列化程序(如 DataContractSerializer)进行序列化。若要使其类型可序列化,类型作者必须为其类型定义数据协定。

  • 相关阅读:
    AChartEngine方法的使用及事件汇总
    免费的Android UI库及组件推荐
    消灭Bug!十款免费移动应用测试框架推荐
    AChartEngine 安卓折线图 柱形图等利器
    添加几个有用的网址
    演示Android百度地图操作功能
    Android 如何在Eclipse中查看Android API源码 及 support包源码
    Android入门之GPS定位详解
    软考之数据库部分
    SSE && WebSockets
  • 原文地址:https://www.cnblogs.com/Dlonghow/p/1393702.html
Copyright © 2011-2022 走看看