zoukankan      html  css  js  c++  java
  • 使用DataContractJsonSerializer类将类型实例序列化为JSON字符串和反序列化为实例对象 分类: JSON 前端 2014-11-10 10:20 97人阅读 评论(1) 收藏

    一、JSON简介

        JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式。

        JSON是“名值对”的集合。结构由大括号'{}',中括号'[]',逗号',',冒号':',双引号'“”'组成,包含的数据类型有Object,Number,Boolean,String,Array, NULL等。

        JSON具有以下的形式:

        对象(Object)是一个无序的“名值对”集合,一个对象以”{”开始,”}”结束。每个“名”后跟着一个”:”,多个“名值对”由逗号分隔。如:

    {"FirstName":"Jason","LastName":"Chen"}

    数组(Array)是值的有序集合,一个数组以“[”开始,“]”结束,值之间使用“,”分隔。如:

    [{"FirstName":"Jason","LastName":"Chen"},{"FirstName":"Jason","LastName":"Chen"}]

    字符串(String)是由双引号包围的任意数量的Unicode字符的集合,使用反斜线转义。

    二、对JSON数据进行序列化和反序列化

        可以使用DataContractJsonSerializer类将类型实例序列化为JSON字符串,并将JSON字符串反序列化为类型实例。

    利用DataContractJsonSerializer序列化和反序列化的代码:

    using System;
    using System.IO;
    using System.Runtime.Serialization.Json;
    using System.Text;
    using System.Text.RegularExpressions;
    /*
     *  DataContractJsonSerializer在System.Runtime.Serialization.Json命名空间下,
     *  .NET Framework 3.5包含在System.ServiceModel.Web.dll中;
     *  .NET Framework 4.0包含在System.Runtime.Serialization中。
     *  create by cjj on 2014-10-08;email:ijasonchen91@sina.com<span style="font-family: Arial, Helvetica, sans-serif;">。</span>
     */
    namespace mob.json
    {
    
        /// <summary>
        /// JSON序列化和反序列化辅助类
        /// </summary>
        public class JsonHelper
        {
            /// <summary>
            /// JSON序列化
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="t"></param>
            /// <returns></returns>
            public static string Serialize<T>(T t)
            {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
                MemoryStream ms = new MemoryStream();
                serializer.WriteObject(ms, t);
                string jsonString = Encoding.Default.GetString(ms.ToArray());
                ms.Close();
                jsonString = ConvertToDateTimeString(jsonString);
                return jsonString;
            }
    
            /// <summary>
            /// JSON反序列化
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="jsonString"></param>
            /// <returns></returns>
            public static T Deserialize<T>(string jsonString)
            {
    
                jsonString = ConvertToJsonDateTimeString(jsonString);
    
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
                MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonString));
                T obj = (T)serializer.ReadObject(ms);
                ms.Close();
                return obj;
            }
    
            /// <summary>
            /// 将"/Date(673286400000+0800)/"Json时间格式替换"yyyy-MM-dd HH:mm:ss"格式的字符串
            /// </summary>
            /// <param name="jsonDateTimeString">"/Date(673286400000+0800)/"Json时间格式</param>
            /// <returns></returns>
            private static string ConvertToDateTimeString(string jsonDateTimeString)
            {
                string result = string.Empty;
                string p = @"\/Date((d+)+d+)\/";
                MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString);
                Regex reg = new Regex(p);
                result = reg.Replace(jsonDateTimeString, matchEvaluator);
                return result;
            }
    
            private static string ConvertJsonDateToDateString(Match match)
            {
                string result = string.Empty;
                DateTime dt = new DateTime(1970, 1, 1);
                dt = dt.AddMilliseconds(long.Parse(match.Groups[1].Value));
                dt = dt.ToLocalTime();
                result = dt.ToString("yyyy-MM-dd HH:mm:ss");
                return result;
            }
    
            /// <summary>
            /// 将"yyyy-MM-dd HH:mm:ss"格式的字符串替换"/Date(673286400000+0800)/"Json时间格式
            /// </summary>
            /// <param name="dateTimeString">"yyyy-MM-dd HH:mm:ss"格式的字符串</param>
            /// <returns></returns>
            private static string ConvertToJsonDateTimeString(string dateTimeString)
            {
                string result = string.Empty;
    
                string p = @"d{4}-d{2}-d{2}sd{2}:d{2}:d{2}";
                MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate);
                Regex reg = new Regex(p);
                result = reg.Replace(dateTimeString, matchEvaluator);
                return result;
            }
    
            private static string ConvertDateStringToJsonDate(Match match)
            {
                string result = string.Empty;
                DateTime dt = DateTime.Parse(match.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

    [DataContract]
    public class Person
    {
        public Person() { }
    
        public Person(string firstname, string lastname, DateTime birthday)
        {
            this.FirstName = firstname;
            this.LastName = lastname;
            this.Birthday = birthday;
        }
    
        [DataMember]
        public string FirstName { get; set; }
        [DataMember]
        public string LastName { get; set; }
        [DataMember]
        public DateTime Birthday { get; set; }
    }
    

    序列化为JSON字符串:

    private void Serialize()
    {
        Person p = new Person("Jason", "Chen", Convert.ToDateTime("1991-05-04"));
        string jsonString = JsonHelper.Serialize<Person>(p);
        Response.Write(jsonString);
    }
    

    输出结果:

    {"Birthday":"1991-05-04 00:00:00","FirstName":"Jason","LastName":"Chen"}

    反序列化Demo

    private static void Deserialize()
    {
        string jsonString = "{"FirstName":"Jason","LastName":"Chen","Birthday":"1991-05-04 00:00:00"}";
        Person p = JsonHelper.Deserialize<Person>(jsonString);
    }
    
    运行结果:

    三、JSON序列化集合、字典、数组的处理

        JSON数据中,所有的集合、字典和数组都表示为数组。

        List<T>序列化:

    private void Serialize()
    {
        List<Person> list = new List<Person>(){
            new Person("Jason", "Chen", Convert.ToDateTime("1991-05-04")),
            new Person("Jack", "Chen", Convert.ToDateTime("1991-05-05"))
        };
        string jsonString = JsonHelper.Serialize<List<Person>>(list);
        Response.Write(jsonString);
    }
    

     序列化结果:

    [{"Birthday":"1991-05-04 00:00:00","FirstName":"Jason","LastName":"Chen"},{"Birthday":"1991-05-05 00:00:00","FirstName":"Jack","LastName":"Chen"}]

    Dictionary字典转化为JSON,如:

    private void Serialize()
    {
        Dictionary<string, string> dic = new Dictionary<string, string>();
        dic.Add("FirstName", "Jason");
        dic.Add("LastName", "Chen");
        string jsonString = JsonHelper.Serialize<Dictionary<string, string>>(dic);
        Response.Write(jsonString);
    }
    

    序列化结果:

    [{"Key":"FirstName","Value":"Jason"},{"Key":"LastName","Value":"Chen"}]


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    leetcode 1301. 最大得分的路径数目
    LeetCode 1306 跳跃游戏 III Jump Game III
    LeetCode 1302. 层数最深叶子节点的和 Deepest Leaves Sum
    LeetCode 1300. 转变数组后最接近目标值的数组和 Sum of Mutated Array Closest to Target
    LeetCode 1299. 将每个元素替换为右侧最大元素 Replace Elements with Greatest Element on Right Side
    acwing 239. 奇偶游戏 并查集
    acwing 238. 银河英雄传说 并查集
    acwing 237程序自动分析 并查集
    算法问题实战策略 MATCHORDER 贪心
    Linux 安装Redis全过程日志
  • 原文地址:https://www.cnblogs.com/chenjinjian/p/4714268.html
Copyright © 2011-2022 走看看