序列化和发序列化

使用场景:随着技术的更新,对数据的处理方式也变得多样化,如:xml/html/json/xpath 等等,现在我主要是想说一下(反)序列化中对象和json字符串的互相转换。json 是一种非常方便的数据存储格式,想要了解更多json方面的知识,请点击;http://www.json.org/json-zh.html.

1. 使用 System.Web.Script.Serialization.JavaScriptSerializer 使用这个泪序列化和发序列化。

首先新建一个实体类。

    public class SerializerDemo
    {
        public int ID { set; get; }

        public string OjbectName { set; get; }
    }

接着通过以下代码序列化和发序列化

 protected void Page_Load(object sender, EventArgs e)
        {
            List<SerializerDemo> list = new List<SerializerDemo> { 
                                            new SerializerDemo(){ID=001,OjbectName="SerializerOne"},
                                            new SerializerDemo(){ID=002,OjbectName="SerializerTwo"},
                                            new SerializerDemo(){ID=003,OjbectName="Serializer"}
                                        };
            SerializerDemo demo = new SerializerDemo() { ID=100,OjbectName="serializerDemo"};
            // 1.0 将一个对象序列化为json字符串
            System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
            string json = serializer.Serialize(list); // 将一个集合序列化为一个json数组字符串
            string jsonOne = serializer.Serialize(demo); // 将一个对象序列化为一个json字符串
            tbJson.Text = json;
            // 反序列json字符串为对象,对于这种方式,数组的json字符串不支持反序列化
            string newJson = json.Replace("[","").Replace("]","");
            //var newObjects = serializer.Deserialize<List<SerializerDemo>>(newJson);
            //for (int i = 0; i < newObjects.Count; i++)
            //{
            //    TextBox1.Text = newObjects[i].ID + " ," + newObjects[i].OjbectName;
            //}

            SerializerDemo objects = serializer.Deserialize<SerializerDemo>(jsonOne) as SerializerDemo;
            tbObject.Text = "Id=" + objects.ID + "Name="+objects.OjbectName;

        }

2. 这是从网上找到的一些序列化的方法,加上注释。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;

namespace WebSerializer
{
    /// <summary>
    /// Json 序列化和反序列化辅助类
    /// </summary>
    public class JsonHelper
    {
        /// <summary>
        /// json 的序列化
        /// </summary>
        /// <typeparam name="T">类型参数</typeparam>
        /// <param name="t">要序列化的对象</param>
        /// <returns>返回序列化后的Json字符串</returns>
        public static string JsonSerializer<T>(T t)
        {
            // 将对象序列化为 JavaScript 对象表示法 (JSON),并将 JSON 数据反序列化为对象
            DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
            MemoryStream ms = new MemoryStream();
            // 将指定对象序列化为 JavaScript 对象表示法 (JSON) 数据,并将生成的 JSON 写入流中。
            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>
        /// <typeparam name="T">类型参数</typeparam>
        /// <param name="jsonString">需要序列化的Json字符串</param>
        /// <returns>返回json反序列化的后的对象</returns>
        public static T JsonDeSerialiser<T>(string jsonString) where T : class
        {
            //将"yyyy-MM-dd HH:mm:ss"格式的字符串转为"\/Date(1294499956278+0800)\/"格式
            string p = @"\d{4}-\d{2}-\d{2}\s\d{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));
            // 将josn格式字符串 以byte[]的形式存入到内存流中
            MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
            // 以json格式读取文档流,并且返回序列化后的对象
            T obj = ser.ReadObject(ms) as T;
            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;
        }

    }
}
View Code

3. javascript对时间的处理。

function ChangeDateFormat(jsondate) {
jsondate = jsondate.replace("/Date(", "").replace(")/", "");
if (jsondate.indexOf("+") > 0) {
jsondate = jsondate.substring(0, jsondate.indexOf("+"));
}
else if (jsondate.indexOf("-") > 0) {
jsondate = jsondate.substring(0, jsondate.indexOf("-"));
}

var date = new Date(parseInt(jsondate, 10));
var month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1;
var currentDate = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
return date.getFullYear() + "-" + month + "-" + currentDate;
}

 



 

posted on 2015-03-06 10:52  Mr.YM  阅读(121)  评论(2编辑  收藏  举报

导航