JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式。在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间、集合、字典的处理。

    一、JSON简介

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

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

JSON具有以下的形式:

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

var user={"name":"张三","gender":"男","birthday":"1980-8-8"}

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

var userlist=[{"user":{"name":"张三","gender":"男","birthday":"1980-8-8"}},{"user":{"name":"李四","gender":"男","birthday":"1985-5-8"}}];

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

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

可以使用DataContractJsonSerializer类将类型实例序列化为JSON字符串,并将JSON字符串反序列化为类型实例。DataContractJsonSerializer在System.Runtime.Serialization.Json命名空间下,.NET Framework 3.5包含在System.ServiceModel.Web.dll中,需要添加对其的引用;.NET Framework 4在System.Runtime.Serialization中。

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

: using System;
: using System.Collections.Generic;
: using System.Linq;
: using System.Web;
: using System.Runtime.Serialization.Json;
: using System.IO;
: using System.Text;
:
: /// <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();
: return jsonString;
: }
:
: /// <summary>
: /// JSON反序列化
: /// </summary>
: public static T JsonDeserialize<T>(string jsonString)
: {
: DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
: MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
: T obj = (T)ser.ReadObject(ms);
: return obj;
: }
: }

    序列化Demo:

简单对象Person:

 : public class Person
: {
: public string Name { get; set; }
: public int Age { get; set; }
: }

序列化为JSON字符串:

 : protected void Page_Load(object sender, EventArgs e)
: {
: Person p = new Person();
: p.Name = "张三";
: p.Age = ;
:
: string jsonString = JsonHelper.JsonSerializer<Person>(p);
: Response.Write(jsonString);
: }

输出结果:

{"Age":,"Name":"张三"} 

反序列化Demo:

 : protected void Page_Load(object sender, EventArgs e)
: {
: string jsonString = "{\"Age\":28,\"Name\":\"张三\"}";
: Person p = JsonHelper.JsonDeserialize<Person>(jsonString);
: }

运行结果:

ASP.NET中的JSON序列化和反序列化还可以使用JavaScriptSerializer,在System.Web.Script.Serializatioin命名空间下,需引用System.Web.Extensions.dll.也可以使用JSON.NET.

    三、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 = ;
: p.LastLoginTime = DateTime.Now;
:
: string jsonString = JsonHelper.JsonSerializer<Person>(p);
     序列化结果:
{"Age":,"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}\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));
: 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(,,);
: dt = dt.AddMilliseconds(long.Parse(m.Groups[].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[].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 = ;
: p.LastLoginTime = DateTime.Now;
:
: string jsonString = JsonHelper.JsonSerializer<Person>(p);

运行结果:

{"Age":,"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);

运行结果:

在后台替换字符串适用范围比较窄,如果考虑到全球化的有多种语言还会更麻烦。

2、利用JavaScript处理

 : function ChangeDateFormat(jsondate) {
: jsondate = jsondate.replace("/Date(", "").replace(")/", "");
: if (jsondate.indexOf("+") > ) {
: jsondate = jsondate.substring(, jsondate.indexOf("+"));
: }
: else if (jsondate.indexOf("-") > ) {
: jsondate = jsondate.substring(, jsondate.indexOf("-"));
: }
:
: var date = new Date(parseInt(jsondate, ));
: var month = date.getMonth() + < ? "" + (date.getMonth() + ) : date.getMonth() + ;
: var currentDate = date.getDate() < ? "" + date.getDate() : date.getDate();
: return date.getFullYear() + "-" + month + "-" + currentDate;
: }

简单Demo :

ChangeDateFormat("\/Date(1294499956278+0800)\/");

结果:

--

    四、JSON序列化和反序列化集合、字典、数组的处理

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

List<T>序列化:

 : List<Person> list = new List<Person>()
: {
: new Person(){ Name="张三", Age=},
: new Person(){ Name="李四", Age=}
: };
:
: string jsonString = JsonHelper.JsonSerializer<List<Person>>(list);

序列化结果:

"[{\"Age\":28,\"Name\":\"张三\"},{\"Age\":25,\"Name\":\"李四\"}]"

    字典不能直接用于JSON,Dictionary字典转化为JSON并不是跟原来的字典格式一致,而是形式以Dictionary的Key作为名称”Key“的值,以Dictionary的Value作为名称为”Value“的值 。如:

: Dictionary<string, string> dic = new Dictionary<string, string>();
: dic.Add("Name", "张三");
: dic.Add("Age", "");
:
: string jsonString = JsonHelper.JsonSerializer < Dictionary<string, string>>(dic);

序列化结果:

   : "[{\"Key\":\"Name\",\"Value\":\"张三\"},{\"Key\":\"Age\",\"Value\":\"28\"}]"

五、JSON反序列化

 JavaScriptSerializer js = new JavaScriptSerializer();
dynamic modelDy = js.Deserialize<dynamic>(PersonnelItem); //反序列化

JSON官网:http://www.json.org/json-zh.html

独立JSON序列化:http://msdn.microsoft.com/zh-cn/library/bb412170.aspx

如何对JSON序列化和反序列化:http://msdn.microsoft.com/zh-cn/library/bb412179.aspx

ASP.NET中JSON的序列化和反序列化(转)的更多相关文章

  1. Asp.net中Json的序列化和反序列化(一)

    JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...

  2. ASP.NET中JSON的序列化和反序列化

    JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍 ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介 ...

  3. ASP.NET 中JSON 的序列化和反序列化

    JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...

  4. [转]ASP.NET中JSON的序列化和反序列化

    本文转自:http://www.cnblogs.com/zhaozhan/archive/2011/01/09/1931340.html JSON是专门为浏览器中的网页上运行的JavaScript代码 ...

  5. Asp.Net中JSON的序列化和反序列化-----JavaScriptSerializer ,加上自己工作心得

    在工作中和手机通信用到web服务和javascriptSerializer,返回json数据,供手机端调用,一开始返回的数据是一大堆,比如 [{"word_picture9":&q ...

  6. Asp.net中Json的序列化和反序列化(二)

     三.JSON序列化和反序列化日期时间的处理 JSON格式不直接支持日期和时间.DateTime值值显示为“/Date(700000+0500)/”形式的JSON字符串,其中第一个数字(在提供的示例中 ...

  7. ASP.NET MVC Json的序列化和反序列化

    1.利用js进行序列化成字符串和反序列化 var personObj = {name:"Tom",age:16}; // 利用JS序列化成字符串 var personStr = J ...

  8. .NET中JSON的序列化和反序列化的几种方式

    一.什么是JSON JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于ECMAScript(欧洲计算机协会制定的js规范)的一个子集 ...

  9. golang中json包序列化与反序列化

    package main import ( "encoding/json" "fmt" "reflect" ) type Info stru ...

随机推荐

  1. Python 再次改进版通过队列实现一个生产者消费者模型

    import time from multiprocessing import Process,Queue #生产者 def producer(q): for i in range(10): time ...

  2. JAVA之字母与相对应数字转换

    26个字母大小写加起来就是52个.对应的数字范围 System.out.println((char)97);//aSystem.out.println((char)122);//zSystem.out ...

  3. codeforce 839A Arya and Bran(水题)

    Bran and his older sister Arya are from the same house. Bran like candies so much, so Arya is going ...

  4. PAT 乙级 1061. 判断题(15)

    判断题的评判很简单,本题就要求你写个简单的程序帮助老师判题并统计学生们判断题的得分. 输入格式: 输入在第一行给出两个不超过100的正整数N和M,分别是学生人数和判断题数量.第二行给出M个不超过5的正 ...

  5. RESTful Web Service 架构

    特点:简单,可靠,高效,跨平台和跨语言 含义: Web Service 简单来说是指提供给不同设备通过互联网(一般使用 HTTP 协议)进行通信和交换数据的一种服务.RESTful Web Servi ...

  6. ORA-00600: internal error code, arguments: [kcblasm_1], [103], [] bug

    巡检发现存在alert 日志存在ORA-600 1.0 查询alter 对应的Trace日志 /oracle/admin/fgsquery/udump/fgsquery_ora_21777.trc O ...

  7. 20155219 《Java程序设计》实验一(Java开发环境的熟悉)实验报告

    一.实验内容及步骤 1.使用JDK编译.运行简单的java程序 先在命令行中按老师要求输入,之后编译运行,如下图. 具体代码如下: package src.shiyan1; import java.u ...

  8. xdoj-1211 (尧老师要教孩子解方程) :多项式除法

    想法: 1 由于所有a[i] 是不为0的整数 所以解x是整数 2 其次解是an的约数 3 分解a[n] 用多项式除法判断约数是否为整式的解 #include<cstdio> #includ ...

  9. 第8次Scrum会议(10/20)【欢迎来怼】

    一.小组信息 队名:欢迎来怼 小组成员 队长:田继平 成员:李圆圆,葛美义,王伟东,姜珊,邵朔,冉华 小组照片 二.开会信息 时间:2017/10/20 17:20~17:45,总计25min. 地点 ...

  10. windows server 2008 R2无法共享文件夹,无法启用网络发现。

    问题描述:在局域网内两台window server 2008 R2服务器上设置共享文件夹,如要再网络中可以看到文件夹,需要开启“网络发现” 但是即使打开了“网络发现”,当重新打开“高级共享设置”的时候 ...