程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> asp.net JSON序列化與反序列化使用

asp.net JSON序列化與反序列化使用

編輯:關於ASP.NET

       對JSON數據進行序列化和反序列化

      可以使用DataContractJsonSerializer類將類型實例序列化為JSON字符串,並將JSON字符串反序列化為類型實例。 DataContractJsonSerializer在System.Runtime.Serialization.Json命名空間下,.NET Framework 3.5包含在System.ServiceModel.Web.dll中,需要添加對其的引用;.NET Framework 4在System.Runtime.Serialization中。

      方法一:引入System.Web.Script.Serialization命名空間使用 JavaScriptSerializer類實現簡單的序列化序列化類:Personnel

    代碼如下   public class Personnel
    {
    public int Id { get; set; }
    public string Name { get; set; }
    }

      執行序列化反序列化:

    代碼如下  

    protected void Page_Load(object sender, EventArgs e)
    {
    Personnel personnel = new Personnel();
    personnel.Id = 1;
    personnel.Name = "小白";

    JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
    //執行序列化
    string r1 = jsonSerializer.Serialize(personnel);

    //執行反序列化
    Personnel _Personnel = jsonSerializer.Deserialize<Personnel>(r1);
    }

     

      r1輸出結果:{"Id":1,"Name":"小白"}

      可以使用 ScriptIgnore屬性標記不序列化公共屬性或公共字段。

    代碼如下   public class Personnel
    {
    [ScriptIgnore]
    public int Id { get; set; }
    public string Name { get; set; }
    }

      r1輸出結果:{"Name":"小白"}

      方法二:引入 System.Runtime.Serialization.Json命名空間使用 DataContractJsonSerializer類實現序列化

      序列化類:People

    代碼如下  

     

    public class People
    {
    public int Id { get; set; }
    public string Name { get; set; }
    }

      執行序列化反序列化

    代碼如下  

    protected void Page_Load(object sender, EventArgs e)
    {
    People people = new People();
    people.Id = 1;
    people.Name = "小白";


    DataContractJsonSerializer json = new DataContractJsonSerializer(people.GetType());
    string szJson = "";
    //序列化
    using (MemoryStream stream = new MemoryStream())
    {
    json.WriteObject(stream, people);
    szJson = Encoding.UTF8.GetString(stream.ToArray());
    }
    //反序列化
    using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson)))
    {
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(People));
    People _people = (People)serializer.ReadObject(ms);
    }
    }

     

      szJson輸出結果:{"Id":1,"Name":"小白"}

      可以使用IgnoreDataMember:指定該成員不是數據協定的一部分且沒有進行序列化,DataMember:定義序列化屬性參數,使用DataMember屬性標記字段必須使用DataContract標記類 否則DataMember標記不起作用。

    代碼如下  

     

    [DataContract]
    public class People
    {
    [DataMember(Name = "id")]
    public int Id { get; set; }
    [IgnoreDataMember]
    public string Name { get; set; }
    }

      輸出結果: {"id":1}

      JSON序列化和反序列化日期時間的處理

      JSON格式不直接支持日期和時間。DateTime值值顯示為“/Date(700000+0500)/”形式的JSON字符串,其中第一個數字(在提 供的示例中為 700000)是 GMT 時區中自 1970 年 1 月 1 日午夜以來按正常時間(非夏令時)經過的毫秒數。該數字可以是負數,以表示之前的時間。示例中包括“+0500”的部分可選,它指示該時間屬於Local 類型,即它在反序列化時應轉換為本地時區。如果沒有該部分,則會將時間反序列化為Utc。

      修改Person類,添加LastLoginTime:

    代碼如下   public class Person
    {
    public string Name { get; set; }
    public int Age { get; set; }
    public DateTime LastLoginTime { get; set; }
    }
    Person p = new Person();
    p.Name = "張三";
    p.Age = 28;
    p.LastLoginTime = DateTime.Now;
    string jsonString = JsonHelper.JsonSerializer<Person>(p);

      序列化結果:

      {"Age":28,"LastLoginTime":"/Date(1294499956278+0800)/","Name":"張三"}

      1. 在後台使用正則表達式對其替換處理。修改JsonHelper:

    代碼如下  
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Runtime.Serialization.Json;
    using System.IO;
    using System.Text;
    using System.Text.RegularExpressions;
    /// <summary>
    /// JSON序列化和反序列化輔助類
    /// </summary>
    public class JsonHelper
    {
    /// <summary>
    /// JSON序列化
    /// </summary>
    public static string JsonSerializer<T>(T t)
    {
    DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
    MemoryStream ms = new MemoryStream();
    ser.WriteObject(ms, t);
    string jsonString = Encoding.UTF8.GetString(ms.ToArray());
    ms.Close();
    //替換Json的Date字符串
    string p = @"/Date((d+)+d+)/";
    MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString);
    Regex reg = new Regex(p);
    jsonString = reg.Replace(jsonString, matchEvaluator);
    return jsonString;
    }
    /// <summary>
    /// JSON反序列化
    /// </summary>
    public static T JsonDeserialize<T>(string jsonString)
    {
    //將"yyyy-MM-dd HH:mm:ss"格式的字符串轉為"/Date(1294499956278+0800)/"格式
    string p = @"d{4}-d{2}-d{2}sd{2}:d{2}:d{2}";
    MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate);
    Regex reg = new Regex(p);
    jsonString = reg.Replace(jsonString, matchEvaluator);
    DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
    MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
    T obj = (T)ser.ReadObject(ms);
    return obj;
    }
    /// <summary>
    /// 將Json序列化的時間由/Date(1294499956278+0800)轉為字符串
    /// </summary>
    private static string ConvertJsonDateToDateString(Match m)
    {
    string result = string.Empty;
    DateTime dt = new DateTime(1970,1,1);
    dt = dt.AddMilliseconds(long.Parse(m.Groups[1].Value));
    dt = dt.ToLocalTime();
    result = dt.ToString("yyyy-MM-dd HH:mm:ss");
    return result;
    }
    /// <summary>
    /// 將時間字符串轉為Json時間
    /// </summary>
    private static string ConvertDateStringToJsonDate(Match m)
    {
    string result = string.Empty;
    DateTime dt = DateTime.Parse(m.Groups[0].Value);
    dt = dt.ToUniversalTime();
    TimeSpan ts = dt - DateTime.Parse("1970-01-01");
    result = string.Format("/Date({0}+0800)/",ts.TotalMilliseconds);
    return result;
    }
    }

      序列化Demo:

    代碼如下   Person p = new Person();
    p.Name = "張三";
    p.Age = 28;
    p.LastLoginTime = DateTime.Now;
    string jsonString = JsonHelper.JsonSerializer<Person>(p);

      運行結果:

    代碼如下   {"Age":28,"LastLoginTime":"2011-01-09 01:00:56","Name":"張三"}
    反序列化Demo:
    string json = "{"Age":28,"LastLoginTime":"2011-01-09 00:30:00","Name":"張三"}";
    p=JsonHelper.JsonDeserialize<Person>(json);
    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved