对JSON数据进行序列化和反序列化
可以使用DataContractJsonSerializer类将类型实例序列化为JSON字符串并将JSON字符串反序列化为类型实例 DataContractJsonSerializer在SystemRuntimeSerializationJson命名空间下NET Framework 包含在SystemServiceModelWebdll中需要添加对其的引用;NET Framework 在SystemRuntimeSerialization中
方法一引入SystemWebScriptSerialization命名空间使用 JavaScriptSerializer类实现简单的序列化序列化类Personnel
代码如下 public class Personnel
{
public int Id { get; set; }
public string Name { get; set; }
}
执行序列化反序列化
代码如下
protected void Page_Load(object sender EventArgs e)
{
Personnel personnel = new Personnel();
personnelId = ;
personnelName = "小白";
JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
//执行序列化
string r = jsonSerializerSerialize(personnel);
//执行反序列化
Personnel _Personnel = jsonSerializerDeserialize<Personnel>(r);
}
r输出结果{"Id":"Name":"小白"}
可以使用 ScriptIgnore属性标记不序列化公共属性或公共字段
代码如下 public class Personnel
{
[ScriptIgnore]
public int Id { get; set; }
public string Name { get; set; }
}
r输出结果{"Name":"小白"}
方法二引入 SystemRuntimeSerializationJson命名空间使用 DataContractJsonSerializer类实现序列化
序列化类People
代码如下
public class People
{
public int Id { get; set; }
public string Name { get; set; }
}
执行序列化反序列化
代码如下
protected void Page_Load(object sender EventArgs e)
{
People people = new People();
peopleId = ;
peopleName = "小白";
DataContractJsonSerializer json = new DataContractJsonSerializer(peopleGetType());
string szJson = "";
//序列化
using (MemoryStream stream = new MemoryStream())
{
jsonWriteObject(stream people);
szJson = EncodingUTFGetString(streamToArray());
}
//反序列化
using (MemoryStream ms = new MemoryStream(EncodingUTFGetBytes(szJson)))
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(People));
People _people = (People)serializerReadObject(ms);
}
}
szJson输出结果{"Id":"Name":"小白"}
可以使用IgnoreDataMember:指定该成员不是数据协定的一部分且没有进行序列化DataMember:定义序列化属性参数使用DataMember属性标记字段必须使用DataContract标记类 否则DataMember标记不起作用
代码如下
[DataContract]
public class People
{
[DataMember(Name = "id")]
public int Id { get; set; }
[IgnoreDataMember]
public string Name { get; set; }
}
输出结果: {"id":}
JSON序列化和反序列化日期时间的处理
JSON格式不直接支持日期和时间DateTime值值显示为“/Date(+)/”形式的JSON字符串其中第一个数字(在提 供的示例中为 )是 GMT 时区中自 年 月 日午夜以来按正常时间(非夏令时)经过的毫秒数该数字可以是负数以表示之前的时间示例中包括“+”的部分可选它指示该时间属于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(+)/""Name":"张三"}
在后台使用正则表达式对其替换处理修改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
UTF
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(
+
)/"格式
string p = @"d{
}
d{
}
d{
}sd{
}:d{
}:d{
}";
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
UTF
GetBytes(jsonString));
T obj = (T)ser
ReadObject(ms);
return obj;
}
/// <summary>
/// 将Json序列化的时间由/Date(
+
)转为字符串
/// </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("
");
result = string
Format("\/Date({
}+
)\/"
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":"
:
:
"
"Name":"张三"}
反序列化Demo
string json = "{"Age":
"LastLoginTime":"
:
:
"
"Name":"张三"}";
p=JsonHelper
JsonDeserialize<Person>(json);