使用JavaScriptSerializer序列化集合、字典、数组、DataTable为JSON字符串 分类: 前端 数据格式 JSON 2014-10-30 14:08 169人阅读 评论(0) 收藏

一、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字符的集合,使用反斜线转义。

二、对数据进行序列化

    可以使用JavaScriptSerializer类将类型实例序列化为JSON字符串。

利用JavaScriptSerializer序列化的代码: 

using System;
using System.Collections.Generic;
using System.Data;
using System.Text.RegularExpressions;
using System.Web.Script.Serialization;
/*
 *  JavaScriptSerializer在System.Web.Script.Serialization命名空间下。
 *  create by cjj on 2014-10-08;email:ijasonchen91@sina.com
 */
namespace mob
{
    /// <summary>
    /// JSON序列化和反序列化辅助类
    /// </summary>
    public static class JsonHelper
    {

        /// <summary>
        /// JSON序列化
        /// </summary>
        /// <param name="obj">源对象</param>
        /// <returns>json数据格式</returns>
        public static string ToJson(object obj)
        {
            JavaScriptSerializer serialize = new JavaScriptSerializer();
            return serialize.Serialize(obj);
        }

        /// <summary>
        /// 将字符串数组转换为json数据格式:["value1","value2",...]
        /// </summary>
        /// <param name="strs">字符串数组</param>
        /// <returns>json数据格式</returns>
        public static string ToJson(this string[] strs)
        {
            return ToJson((object)strs);
        }

        /// <summary>
        /// 将DataTable数据源转换为json数据格式:[{"ColumnName":"ColumnValue",...},{"ColumnName":"ColumnValue",...},...]
        /// </summary>
        /// <param name="dt">DataTable数据源</param>
        /// <returns>json数据格式</returns>
        public static string ToJson(this DataTable dt)
        {
            List<object> list = new List<object>();
            foreach (DataRow dr in dt.Rows)
            {
                Dictionary<string, object> dic = new Dictionary<string, object>();
                foreach (DataColumn dc in dt.Columns)
                {
                    dic.Add(dc.ColumnName, dr[dc].ToString());
                }
                list.Add(dic);
            }
            return ToJson(list);
        }

        /// <summary>
        /// 将"/Date(673286400000)/"Json时间格式替换"yyyy-MM-dd HH:mm:ss"格式的字符串
        /// </summary>
        /// <param name="jsonDateTimeString">"/Date(673286400000)/"Json时间格式</param>
        /// <returns></returns>
        public static string ConvertToDateTimeString(this string jsonDateTimeString)
        {
            string result = string.Empty;
            string p = @"\/Date((d+))\/";
            MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString);
            Regex reg = new Regex(p);
            result = reg.Replace(jsonDateTimeString, matchEvaluator);
            return result;
        }

        public 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;
        }
    }
}

简单对象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序列化集合、字典、数组、DataTable的处理

  可以使用JavaScriptSerializer类Serialize方法将数据源例序列化为JSON字符串。

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

(1)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.ToJson(list).ConvertToDateTimeString();
    Response.Write(jsonString);
}

序列化结果:

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

 

(2)Dictionary字典转化为JSON并不是跟原来的字典格式一致,而是形式以DictionaryKey作为名称”Key“的值,以DictionaryValue作为名称为”Value“的值。如:

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

序列化结果:

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

 

(3)String数组序列化:

private void Serialize()
{
    string[] ss = new string[] { "老婆", "小三" };
    string jsonString = ss.ToJson();
    Response.Write(jsonString);
}

序列化结果:

["老婆","小三"]

 

(4)DataTable序列化:

private void Serialize()
{
    DataTable dt = new DataTable();
    dt.Columns.Add("Id");
    dt.Columns.Add("Name");
    dt.Columns.Add("Age");
    dt.Rows.Add("1", "老婆", "40");
    dt.Rows.Add("2", "小三", "20");
    string jsonString = dt.ToJson();
    Response.Write(jsonString);
}

序列化结果:

[{"Id":"1","Name":"老婆","Age":"40"},{"Id":"2","Name":"小三","Age":"20"}]

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

原文地址:https://www.cnblogs.com/chenjinjian/p/4714273.html