过去我们使用JSON.net序列化一个对象,在asp.net3.5中已经集成了序列化对象为json的方法。
我们分别针对System.Runtime.Serialization.Json和System.Web.Script.Serialization两个命名空间下的不同方法进行序列化和反序列化。
第一种方法:
System.Runtime.Serialization.Json
(在vs2008添加引用System.Runtime.Serialization 如果在非WEB项目下还需要引用System.ServiceModel.Web)
JosnHelper.CS 代码如下:public class JsonHelper { /// <summary> /// 生成Json格式 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="obj"></param> /// <returns></returns> public static string GetJson<T>(T obj) { DataContractJsonSerializer json = new DataContractJsonSerializer(obj.GetType()); using (MemoryStream stream = new MemoryStream()) { json.WriteObject(stream, obj);
string szJson = Encoding.UTF8.GetString(stream.ToArray()); return szJson; } }
/// <summary> /// 获取Json的Model /// </summary> /// <typeparam name="T"></typeparam> /// <param name="szJson"></param> /// <returns></returns> public static T ParseFromJson<T>(string szJson) { T obj = Activator.CreateInstance<T>(); using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson))) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType()); return (T)serializer.ReadObject(ms); } } }
下面为具体用法声明一个需要输出JSON属性的类public class topMenu { public string id { get; set; }
public string title { get; set; }
public string defaulturl { get; set; } }
本例使它循环三次 利用上面GetJson方法序列化topMenu t_menu = new topMenu() { id = "1", title = "全局", defaulturl = "123456" };
List<topMenu> l_topmenu = new List<topMenu>();
for (int i = 0; i < 3; i++) { l_topmenu.Add(t_menu); }
Response.Write(JsonHelper.GetJson<List<topMenu>>(l_topmenu));
输出结果为:
[{"defaulturl":"123456","id":"1","title":"全局"},{"defaulturl":"123456","id":"1","title":"全局"},{"defaulturl":"123456","id":"1","title":"全局"}]
下面利用上面ParseFromJson方法读取Json
string szJson = @"{""id"":""1"",""title"":""全局"",""defaulturl"":""123456""} "; topMenu t_menu2 = JsonHelper.ParseFromJson<topMenu>(szJson);
Response.Write(t_menu2.title);
输出结果为:全局
第二种方法
System.Web.Script.Serialization
(引用System.Web.Extensions.dll)
还是用到上面方法中JSON属性的类
下面和上面方法中一样。循环三次就。序列化方式不一样
topMenu t_menu = new topMenu()
{
id = "1",
title = "全局",
defaulturl = "123456"
};
List<topMenu> l_topmenu = new List<topMenu>();
for (int i = 0; i < 3; i++)
{
l_topmenu.Add(t_menu);
}
下面用这种方式输出:
JavaScriptSerializer jss = new JavaScriptSerializer();
Response.Write( jss.Serialize(l_topmenu ));
输出结果是相同的
[{"defaulturl":"123456","id":"1","title":"全局"},{"defaulturl":"123456","id":"1","title":"全局"},{"defaulturl":"123456","id":"1","title":"全局"}]
下面利用JavaScriptSerializer中的Deserialize方法读取Json
string szJson = @"{""id"":""1"",""title"":""全局"",""defaulturl"":""123456""} ";
topMenu toptabmenu = jss.Deserialize<topMenu>(szJson);
Response.Write( jss.Serialize(toptabmenu.title));
输出结果为:全局
综上。两种方法个有好处。一个比较灵活。一个较简洁
测试到此结束。但我测试[ScriptIgnore] 不灵。大空有空测试一下。
[ScriptIgnore] 我在网上查了相关资料说把它加在属性上面。可以让JSON序列化忽略它从而不输出。不被序列化
我把[ScriptIgnore]加在JOSN属性类里,让它不被序列化到JSON,我加上不起作用。待测试