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> publicclass JsonHelper { ///<summary> /// JSON序列化 ///</summary> publicstaticstring 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> publicstatic 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 p =new Person();
p.Name ="张三";p.Age =28;p.LastLoginTime = DateTime.Now;string jsonString = JsonHelper.JsonSerializer<Person>(p);运行行结果:{"Age":28,"LastLoginTime":"2011-01-09 01:00:56","Name":"张三"}反序列化Demo:string json ="{\"Age\":28,\"LastLoginTime\":\"2011-01-0900:30:00\",\"Name\":\"张三\"}";p=JsonHelper.JsonDeserialize<Person>(json);运行结果: 在后台替换字符串适用范围比较窄,如果考虑到全球化的有多种语言还会更麻烦。2、利用JavaScript处理
function ChangeDateFormat(jsondate) {
jsondate = jsondate.replace("/Date(", "").replace(")/", "");if (jsondate.indexOf("+") >0) { jsondate = jsondate.substring(0, jsondate.indexOf("+"));}elseif (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;}简单Demo :
ChangeDateFormat("\/Date(1294499956278+0800)\/"); 结果:2011-1-8四、JSON序列化和反序列化集合、字典、数组的处理
在JSON数据中,所有的集合、字典和数组都表示为数组。 List<T>序列化:List<Person> list =new List<Person>(){ new Person(){ Name="张三", Age=28},new Person(){ Name="李四", Age=25}};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", "28");string jsonString = JsonHelper.JsonSerializer < Dictionary<string, string>>(dic);序列化结果:"[{\"Key\":\"Name\",\"Value\":\"张三\"},{\"Key\":\"Age\",\"Value\":\"28\"}]" JSON官网: 独立JSON序列化: 如何对JSON序列化和反序列化: