ASP.NET中的JSON序列化与反序列化

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于网络通信中。本文将介绍JSON的基本概念,以及在ASP.NET中如何进行JSON的序列化和反序列化操作,包括对日期、集合、字典和数组的处理。

一、JSON简介

JSON是一种基于文本的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON采用“键/值”对的形式组织数据,其结构由大括号{}、方括号[]、逗号,、冒号:和双引号"组成。JSON支持以下数据类型:

  • 对象:无序的“键/值”对集合,以{}包裹。
  • 数组:有序的值集合,以[ ]包裹。
  • 字符串:由双引号包裹的Unicode字符序列。
  • 数字:表示数值。
  • 布尔值:true或false。
  • null:表示空值。

JSON的三种风格示例:

var user = { "name": "Tom", "gender": "Male", "birthday": "1983-8-8" }; var userlist = [{ "user": { "name": "Tom", "gender": "Male", "birthday": "1983-8-8" } }, { "user": { "name": "Lucy", "gender": "Female", "birthday": "1984-7-7" } }]; var message = "Hello, World!";

二、在ASP.NET中序列化和反序列化JSON数据

ASP.NET中,可以使用DataContractJsonSerializer类来序列化对象实例到JSON字符串,以及将JSON字符串反序列化回对象实例。DataContractJsonSerializer类位于System.Runtime.Serialization.Json命名空间下,在.NET Framework 3.5中包含在System.ServiceModel.Web.dll中,在.NET Framework 4.0及以上版本中包含在System.Runtime.Serialization中。

以下是使用DataContractJsonSerializer进行序列化和反序列化的示例代码:

using System; using System.IO; using System.Runtime.Serialization.Json; using System.Text; public static class JsonHelper { 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; } 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; } }

示例:定义一个简单的对象Person,并将其序列化为JSON字符串:

public class Person { public string Name { get; set; } public int Age { get; set; } } protected void Page_Load(object sender, EventArgs e) { Person p = new Person(); p.Name = "Tom"; p.Age = 28; string jsonString = JsonHelper.JsonSerializer<Person>(p); Response.Write(jsonString); }

序列化结果:

{"Age":28,"Name":"Tom"}

三、处理日期和时间的JSON序列化和反序列化

JSON标准不支持日期和时间的直接表示。日期和时间值通常被表示为ISO 8601格式的字符串,例如:"/Date(700000+0500)/"。其中,数字部分表示自1970年1月1日以来的毫秒数,可选的时区部分表示本地时间。

为了处理日期和时间的序列化和反序列化,可以修改JsonHelper类,使用正则表达式将日期时间字符串转换为JSON格式,以及将JSON格式转换回日期时间字符串。

using System; using System.IO; using System.Runtime.Serialization.Json; using System.Text; using System.Text.RegularExpressions; public static class JsonHelper { 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()); // 替换JSON日期字符串 string p = @"\\/Date\((\d+)\+\d+\)\\/"; MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString); Regex reg = new Regex(p); jsonString = reg.Replace(jsonString, matchEvaluator); return jsonString; } public static T JsonDeserialize<T>(string jsonString) { // 将 "yyyy-MM-dd HH:mm:ss" 字符串转换为 "\/Date(1319266795390+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; } private static string ConvertJsonDateToDateString(Match m) { string result = string.Empty; DateTime dt = new DateTime(1970, 1, 1); dt = dt.AddMilliseconds(long.Parse(m.Groups[1].Value)); dt = dt.ToLocalTime(); result = dt.ToString("yyyy-MM-dd HH:mm:ss"); return result; } private static string ConvertDateStringToJsonDate(Match m) { string result = string.Empty; DateTime dt = DateTime.Parse(m.Groups[0].Value); dt = dt.ToUniversalTime(); TimeSpan ts = dt - new DateTime(1970, 1, 1); result = string.Format("\\/Date({0}+0800)\\/", ts.TotalMilliseconds); return result; } }

示例:定义一个包含日期和时间属性的Person类,并将其序列化为JSON字符串:

public class Person { public string Name { get; set; } public int Age { get; set; } public DateTime LastLoginTime { get; set; } } protected void Page_Load(object sender, EventArgs e) { Person p = new Person(); p.Name = "Tom"; p.Age = 28; p.LastLoginTime = DateTime.Now; string jsonString = JsonHelper.JsonSerializer<Person>(p); Response.Write(jsonString); }

序列化结果:

{"Age":28,"LastLoginTime":"2011-10-22 14:55:00","Name":"Tom"}

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

在JSON中,所有的集合、字典和数组都以数组的形式表示。以下是一些示例:

集合的序列化:

List<Person> list = new List<Person>() { new Person() { Name = "Tom", Age = 28 }, new Person() { Name = "Lucy", Age = 27 } }; string jsonString = JsonHelper.JsonSerializer<List<Person>>(list);

序列化结果:

[{"Age":28,"Name":"Tom"},{"Age":27,"Name":"Lucy"}] Dictionary<string, string> dic = new Dictionary<string, string>(); dic.Add("Name", "Tom"); dic.Add("Age", "28"); string jsonString = JsonHelper.JsonSerializer<Dictionary<string, string>>(dic); [{"Key":"Name","Value":"Tom"},{"Key":"Age","Value":"28"}]
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485