JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于网络通信中。本文将介绍JSON的基本概念,以及在ASP.NET中如何进行JSON的序列化和反序列化操作,包括对日期、集合、字典和数组的处理。
JSON是一种基于文本的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON采用“键/值”对的形式组织数据,其结构由大括号{}
、方括号[]
、逗号,
、冒号:
和双引号"
组成。JSON支持以下数据类型:
{}
包裹。[ ]
包裹。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中,可以使用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标准不支持日期和时间的直接表示。日期和时间值通常被表示为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中,所有的集合、字典和数组都以数组的形式表示。以下是一些示例:
集合的序列化:
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"}]