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

时间:2023-01-03 22:12:09

一、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并不是跟原来的字典格式一致,而是形式以Dictionary的Key作为名称”Key“的值,以Dictionary的Value作为名称为”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"}]

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

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

  1. 解决如下json格式的字符串不能使用DataContractJsonSerializer序列化和反序列化 分类: JSON 2015-01-28 14&colon;26 72人阅读 评论&lpar;0&rpar; 收藏

    可以解决如下json格式的字符串不能使用DataContractJsonSerializer反序列化 {     "ss": "sss",     " ...

  2. js数组 标签: javascript 2016-08-03 14&colon;15 131人阅读 评论&lpar;0&rpar; 收藏

    数组排序 reverse()方法 reverse()方法会反转数组的顺序. sort()方法 默认情况下sort()方法按升序排列数组项.为实现排序sort()方法调用每项的toString(),然后 ...

  3. js中二维数组的创建方法 2017-04-04 14&colon;50 120人阅读 评论&lpar;0&rpar; 收藏

    法一:var myarr=[[0,1,2],[1,2,3]]; 将[0,1,2]看做原来的0,将[1,2,3]看做原来的1,而二者又分别为子数组 如myarr[0][1]=1,myarr[1][1]= ...

  4. OC基础&colon;数组&period;字典&period;集 分类: ios学习 OC 2015-06-18 18&colon;58 47人阅读 评论&lpar;0&rpar; 收藏

    ==============NSArray(不可变数组)=========== NSArray,继承自NSObject  用来管理(储存)一些有序的对象,不可变数组. 创建一个空数组 NSArray ...

  5. 菜鸟学习-C语言函数参数传递详解-结构体与数组 分类: C&sol;C&plus;&plus; Nginx 2015-07-14 10&colon;24 89人阅读 评论&lpar;0&rpar; 收藏

    C语言中结构体作为函数参数,有两种方式:传值和传址. 1.传值时结构体参数会被拷贝一份,在函数体内修改结构体参数成员的值实际上是修改调用参数的一个临时拷贝的成员的值,这不会影响到调用参数.在这种情况下 ...

  6. C语言基础&colon;数组 分类: iOS学习 c语言基础 2015-06-10 21&colon;40 7人阅读 评论&lpar;0&rpar; 收藏

    数组:是由一组具有相同数据类型的数据组合而来. 数组定义:元素类型修饰符 数组名[数组个数]={元素1,元素2....};  int arr[ 2 ]={1,2};    //正确 int arr[ ...

  7. C语言基础&colon;二维数组 分类: iOS学习 c语言基础 2015-06-10 21&colon;42 16人阅读 评论&lpar;0&rpar; 收藏

    二维数组和一位数组类似. 定义: 数据类型 数组名[行][列]={{ },{ }....}; 定义时,一维(行)的长度可以省略,但是二维(列)的长度不可以省略.但是访问时,一定使用双下标. 二维数组的 ...

  8. cf 61E&period; Enemy is weak 树状数组求逆序数&lpar;WA&rpar; 分类: Brush Mode 2014-10-19 15&colon;16 104人阅读 评论&lpar;0&rpar; 收藏

    #include <iostream> #include <algorithm> #include <cstdio> #include <cstring&gt ...

  9. JAVA 对象数组,加载图片实例 分类: Java Game 2014-08-14 16&colon;57 80人阅读 评论&lpar;0&rpar; 收藏

    主函数: package com.mywork; import java.awt.Color; import java.awt.Image; import javax.swing.ImageIcon; ...

随机推荐

  1. 【转】【收藏】LINQ学习心得分享--------(二)LINQ语法详解

    原地址:http://blog.csdn.net/xuemoyao/article/details/8053444   通过上一章节的学习,相信大家已经掌握了学习LINQ的前期的准备知识.在这一节里, ...

  2. ESP8266 TCP传输AT指令顺序

    ); //复位 ret = ESP8266_Cmd ( );//测试AT启动 ret = ESP8266_Cmd ( );//选择WIFI应用模式softAP+station //ret = ESP8 ...

  3. 【转】C语言文件操作解析&lpar;三&rpar;

    原文网址:http://www.cnblogs.com/dolphin0520/archive/2011/10/07/2200454.html C语言文件操作解析(三) 在前面已经讨论了文件打开操作, ...

  4. 读书笔记-实用单元测试&lpar;英文版&rpar; Pragmatic Unit Testing in C&num; with NUnit

    读书笔记-实用单元测试(英文版) Pragmatic Unit Testing in C# with NUnit Author: Andrew Hunt ,David Thomas with Matt ...

  5. 如何在Dreamweaver中使用zen coding

    在我发表上一篇<Zen Coding: 一种快速编写HTML/CSS代码的方法>之后,有网友表示不知道怎么在Dreamweaver上使用zen coding插件.OK,今天我就写一篇详细的 ...

  6. 大公司的资深工程师和小公司的Leader如何决择?

    很多人在技术的道路上,都会面临选择,一个是大公司的资深工程师/技术专家,一个是小公司的leader,这个选择是一条分叉路口,是持续纵向深入发展,还是横向发展.这实际上就是个人职业规划问题. 接着往专家 ...

  7. Django的url控制器

    一 url配置 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表.也就是ur ...

  8. DEDECMS 多站用一个站图片

    function replaceurl($newurl) { $newurl=str_replace('src="/uploads/allimg/','src="xxx.com/u ...

  9. 将php-fpm添加至service服务

    1. 使用命令:cd /usr/local/php/etc,进入etc目录,编辑 php-fpm.conf 文件,将 ;pid = run/php-fpm.pid  前面的分号去掉 2. 重启php- ...

  10. jQuery开发工具

    开发工具:MyEclipse2014 + aptana插件 下载apada 放到MyEclipse的路径   https://segmentfault.com/a/1190000005711923   ...