使用DataContractJsonSerializer类将类型实例序列化为JSON字符串和反序列化为实例对象 分类: JSON 前端 2014-11-10 10:20 97人阅读 评论(1) 收藏

时间:2021-09-24 14:37:56

一、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字符的集合,使用反斜线转义。

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

可以使用DataContractJsonSerializer类将类型实例序列化为JSON字符串,并将JSON字符串反序列化为类型实例。

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

using System;
using System.IO;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Text.RegularExpressions;
/*
* DataContractJsonSerializer在System.Runtime.Serialization.Json命名空间下,
* .NET Framework 3.5包含在System.ServiceModel.Web.dll中;
* .NET Framework 4.0包含在System.Runtime.Serialization中。
* create by cjj on 2014-10-08;email:ijasonchen91@sina.com<span style="font-family: Arial, Helvetica, sans-serif;">。</span>
*/
namespace mob.json
{ /// <summary>
/// JSON序列化和反序列化辅助类
/// </summary>
public class JsonHelper
{
/// <summary>
/// JSON序列化
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <returns></returns>
public static string Serialize<T>(T t)
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream();
serializer.WriteObject(ms, t);
string jsonString = Encoding.Default.GetString(ms.ToArray());
ms.Close();
jsonString = ConvertToDateTimeString(jsonString);
return jsonString;
} /// <summary>
/// JSON反序列化
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="jsonString"></param>
/// <returns></returns>
public static T Deserialize<T>(string jsonString)
{ jsonString = ConvertToJsonDateTimeString(jsonString); DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonString));
T obj = (T)serializer.ReadObject(ms);
ms.Close();
return obj;
} /// <summary>
/// 将"\/Date(673286400000+0800)\/"Json时间格式替换"yyyy-MM-dd HH:mm:ss"格式的字符串
/// </summary>
/// <param name="jsonDateTimeString">"\/Date(673286400000+0800)\/"Json时间格式</param>
/// <returns></returns>
private static string ConvertToDateTimeString(string jsonDateTimeString)
{
string result = string.Empty;
string p = @"\\/Date\((\d+)\+\d+\)\\/";
MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString);
Regex reg = new Regex(p);
result = reg.Replace(jsonDateTimeString, matchEvaluator);
return result;
} private 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;
} /// <summary>
/// 将"yyyy-MM-dd HH:mm:ss"格式的字符串替换"\/Date(673286400000+0800)\/"Json时间格式
/// </summary>
/// <param name="dateTimeString">"yyyy-MM-dd HH:mm:ss"格式的字符串</param>
/// <returns></returns>
private static string ConvertToJsonDateTimeString(string dateTimeString)
{
string result = string.Empty; 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);
result = reg.Replace(dateTimeString, matchEvaluator);
return result;
} private static string ConvertDateStringToJsonDate(Match match)
{
string result = string.Empty;
DateTime dt = DateTime.Parse(match.Groups[0].Value);
dt = dt.ToUniversalTime();
TimeSpan ts = dt - DateTime.Parse("1970-01-01");
result = string.Format("\\/Date({0}+0800)\\/", ts.TotalMilliseconds);
return result;
}
}
}

序列化Demo:

简单对象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字符串:

private void Serialize()
{
Person p = new Person("Jason", "Chen", Convert.ToDateTime("1991-05-04"));
string jsonString = JsonHelper.Serialize<Person>(p);
Response.Write(jsonString);
}

输出结果:

{"Birthday":"1991-05-04 00:00:00","FirstName":"Jason","LastName":"Chen"}

反序列化Demo:

private static void Deserialize()
{
string jsonString = "{\"FirstName\":\"Jason\",\"LastName\":\"Chen\",\"Birthday\":\"1991-05-04 00:00:00\"}";
Person p = JsonHelper.Deserialize<Person>(jsonString);
}

运行结果:

使用DataContractJsonSerializer类将类型实例序列化为JSON字符串和反序列化为实例对象                                                       分类:            JSON             前端             2014-11-10 10:20    97人阅读    评论(1)    收藏

三、JSON序列化集合、字典、数组的处理

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

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.Serialize<List<Person>>(list);
Response.Write(jsonString);
}

序列化结果:

[{"Birthday":"1991-05-04 00:00:00","FirstName":"Jason","LastName":"Chen"},{"Birthday":"1991-05-05 00:00:00","FirstName":"Jack","LastName":"Chen"}]

Dictionary字典转化为JSON,如:

private void Serialize()
{
Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add("FirstName", "Jason");
dic.Add("LastName", "Chen");
string jsonString = JsonHelper.Serialize<Dictionary<string, string>>(dic);
Response.Write(jsonString);
}

序列化结果:

[{"Key":"FirstName","Value":"Jason"},{"Key":"LastName","Value":"Chen"}]

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