在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
var man = { name: "张三", Age: 24, money: 123123 }; var str1 = JSON.stringify(man); //基本序列化 document.write(str1 + "<br/>"); //{"name":"张三","Age":24,"money":123123} var str2 = JSON.stringify(man, ["name", "Age"]); //指定要序列化的属性 document.write(str2 + "<br/>"); //{"name":"张三","Age":24} var str3 = JSON.stringify(man,["name","Age","money"],"---"); //指定格式化数值 document.write(str3); //{ ---"name": "张三", ---"Age": 24, ---"money": 123123 } JSON.parse() 反序列化一个字符串为JSON对象 语法:JSON.parse(s) JSON.parse(s,reviver) s,要解析的字符串。reviver,用来转换解析值的可选函数 var man = { name: "张三", Age: 17, money: 123123 }; var str1 = JSON.stringify(man, ["name", "Age"]); //指定要序列化的属性 var str2 = JSON.parse(str1); document.write(str2.name + str2.Age + str2.money); //张三24undefined 由于money参数没有序列化,所以undefined 另外由于JSON.parse存在兼容性问题,IE6,IE7并不支持此函数(目前,搜狗,360浏览器也不支持)。所以上网找了两个兼容性比较好的字符串转JSON方法,代码如下: //第一种:eval方式解析 function strToJson(str){ var json = eval('(' + str + ')'); return json; } //第二种:new Function形式 function strToJson(str){ var json = (new Function("return " + str))(); return json; } JSON是一种轻量级的数据交换格式,实质上就是一个javascript对象,因此格式与javascript定义的对象一样。在数据传输过程中,JSON是以字符串的格式传输的。 特别注意:如果obj本来就是一个JSON对象,那么使用eval()函数转换后(哪怕是多次转换)还是JSON对象,但是使用parseJSON()函数处理后会有问题(抛出语法异常)。 到目前为止学会了如果将一个javascript对象转换为JSON,也知道了如何将JSON反转换为javascript对象。现在来结合后台程序,练下手。 先来个jQuery获取后台返回的JSON数据并处理的例子,控制器代码: public ActionResult Index() { return View(); } public JsonResult GetJSON() { return Json(new {Id=1,Name="刘备",Age=23},"text/html",JsonRequestBehavior.AllowGet); } 视图代码: <title>JSON示例</title> <script src="/jquery-1.8.2.min.js" type="text/javascript"></script> <script type="text/javascript"> $(function () { $("#btn1").click(function () { $.ajax({ url: "/Home/GetJSON", type: "post", dataType: "json", success: function (response) { $("#Id").text(response.Id); $("#Name").text(response.Name); $("#Age").text(response.Age); } }) }) }) </script> </head> <body> <div id="imglist"> <ul> <li id="Id"></li> <li id="Name"></li> <li id="Age"></li> </ul> <input type="button" id="btn1" value="确认" /> </div> </body> </html> 此示例实现的效果是,当点击按钮时,三个li的值自动设置为需要的内容。 细心的朋友应该注意到,在Result里面返回了一个JsonRequestBehavior.AllowGet。其实这是一个枚举,在MVC中的JSONResult里面用于控制HTTP Get请求的处理方式,先来了解下这个枚举。 这是一个简单枚举,而且只有两个选项,以兄弟我一贯的方式,依然用个列表展示出来。 成员 成员值 说明 AllowGet 0 允许来自客户端的 HTTP GET 请求。 DenyGet 1 不允许来自客户端的HTTP GET请求。 这可能会生成导致信息泄漏的安全漏洞。(当然这是微软MSDN里面的话) 其实在本例中,这个选项完全可以删开,完全没影响。因为本例的AJAX请求使用的是post方式,但是如果将AJAX的请求设置为get时,如果再不设置该属性为AllowGet时,那就真的获取不到数据了。 要想了解此类的详细信息请查看。 本处只给出一个简单示例。先来看控制器代码: public class HomeController : Controller { public ActionResult Index() { return View(); } public ActionResult GetJSON() { Person p = new Person(); p.Id = 1; p.Name = "关羽"; p.Age = 22; JavaScriptSerializer jss = new JavaScriptSerializer(); string JsonStr = jss.Serialize(p); return Content(JsonStr); } } public class Person { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } 视图代码: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>JSON示例</title> <script src="/jquery-1.8.2.min.js" type="text/javascript"></script> <script type="text/javascript"> $(function () { $("#btn1").click(function () { $.ajax({ url: "/Home/GetJSON", type: "post", dataType: "html", success: function (response) { var obj = JSON.parse(response); $("#Id").text(obj.Id); $("#Name").text(obj.Name); $("#Age").text(obj.Age); } }) }) }) </script> </head> <body> <div id="imglist"> <ul> <li id="Id"></li> <li id="Name"></li> <li id="Age"></li> </ul> <input type="button" id="btn1" value="确认" /> </div> </body> </html> 只代码能够将C#对象中的信息直接在javascript中处理并显示。只是无论是返回JsonResult还是Content都需要JSON.parse()一下,不像第一个示例那样不用转换,不知道是测试出了问题,还是本类就只是这样子。 2013-4-26 今天终于正式了一个长久以来不注重的问题,就是jQuery AJAX返回的dataType:"json"的问题,因为只要设置了dataType为json,就无法进入到seccess。上网查了一下,统一的说法是,jQuery的json变得比较严格,会调用本机的json.Parse来转换,如果存在什么双引号,单引号之类的不符合要求,则不会成功转换,并且不会进入到success。这样一来,.Net本身提供的序列化方法都不能用了。因此,建议还是使用dataType:text 然后再自己转换。 C#对象转Json要引用System.Runtime.Serialization.dll 第一个例子:C#后台将对象转换为Json格式,然后由前台解释: public class HomeController : Controller { public ActionResult Index() { return View(); } public ActionResult GetJson() { Person p = new Person(1, "关羽", 20); string str = ObjToJson2<Person>(p); //return Json(p,JsonRequestBehavior.AllowGet); 这种方法也行,而且是.Net提供的,有这个的时候,用这个比较好,没有就自己搞的。 return Content(str); } //单个对象转Json 方法1 public static string ObjToJson1<T>(T data) { JavaScriptSerializer jss = new JavaScriptSerializer(); string JsonStr = jss.Serialize(data); return JsonStr; } //单个对象转Json 方法2 //要特别注意,方法2要对类以及类的成员加上特性 public static string ObjToJson2<T>(T obj) { try { System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType()); using (MemoryStream ms = new MemoryStream()) { serializer.WriteObject(ms, obj); byte[] byteArr = ms.ToArray(); return Encoding.UTF8.GetString(byteArr); } } catch(Exception ex) { return null; } } } [DataContract] //该类中的特性是对于System.Runtime.Serialization.Json.DataContractJsonSerializer即方法2的转Json设置的,不设置不行。 public class Person { public Person(int id, string name, int age) { Id = id; Name = name; Age = age; } [DataMember] //对方法2要设置成员属性 public int Id { get; set; } [DataMember] public string Name { get; set; } [DataMember] public int Age { get; set; } } /Home/Index视图代码: <html> <head> <title>Json测试</title> <script src="/Scripts/jquery-1.7.2.min.js" type="text/javascript"></script> <script type="text/javascript"> $(function () { $.ajax({ url: "/Home/GetJson", dataType: "text", success: function (response) { alert(response); var obj = strToJson(response); $("#div1").html("姓名:" + obj.Name + " " + "年龄:" + obj.Age); alert(obj.Name); } }) }) function strToJson(str) { var json = eval('(' + str + ')'); return json; } </script> </head> <body> <div id="div1"> </div> </body> </html> 输出结果如下:
Json字符串转Model这里实现的例子是,前台用js拼接一段Json字符串,传送上后台,后台再解释为C#对象,并将年龄+1后返回该对象的Json。 后台代码: namespace MvcApplication1.Controllers { public class HomeController : Controller { public ActionResult Index() { return View(); } public ActionResult JsonToModel(string json) { Person p = ParseFromJson<Person>(json); p.Age = p.Age + 1; //将年龄加大一岁,在序列化返回去 return Json(p,JsonRequestBehavior.AllowGet); } /// <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>(); //注意 要有T类型要有无参构造函数 using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson))) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType()); return (T)serializer.ReadObject(ms); } } } [DataContract] //该类中的特性是对于System.Runtime.Serialization.Json.DataContractJsonSerializer即方法2的转Json设置的,不设置不行。 public class Person { public Person() { } public Person(int id, string name, int age) { Id = id; Name = name; Age = age; } [DataMember] //对方法2要设置成员属性 public int Id { get; set; } [DataMember] public string Name { get; set; } [DataMember] public int Age { get; set; } } } 前台代码: <html> <head> <title>Json测试</title> <script src="/Scripts/jquery-1.7.2.min.js" type="text/javascript"></script> <script type="text/javascript"> $(function () { var o = { Id: 1, Name: "刘备", Age: 23 }; $.ajax({ url: "/Home/JsonToModel", dataType: "text", type:"post", data:{ json: JSON.stringify(o) //将o序列化为字符串 }, success: function (response) { alert(response); var obj = strToJson(response); $("#div1").html("姓名:" + obj.Name + " " + "年龄:" + obj.Age); alert(obj.Name); } }) }) function strToJson(str) { var json = eval('(' + str + ')'); return json; } </script> </head> <body> <div id="div1"> </div> </body> </html> 注意到我们前台拼接的年龄是23。但是返回的是24,说明已经拼接成功了。
DataTable转JSON这里例子是在DataTable转换为JSON的方法,其中还包括了前台javascript解释: public class HomeController : Controller { public ActionResult Index() { return View(); } public ActionResult GetJson() { DataTable dt = new DataTable(); dt.Columns.Add("Id"); dt.Columns.Add("Name"); dt.Columns.Add("Age"); dt.Rows.Add("1", "关羽", "22"); dt.Rows.Add("2", "赵云", "23"); dt.Rows.Add("3", "张飞", "21"); //string strJson = DataTableToJson1(dt); string strJson = dt.ToJson(); //return Json(dt, JsonRequestBehavior.AllowGet); //貌似这个是不支持的,不支持直接将DataTable转换为Json return Content(strJson); } ///<summary> ///方法1 这个方法其实就是DataTable拼接成字符串而已,没什么出奇的 ///</summary> ///<param name="dt"></param> ///<returns></returns> public static string DataTableToJson1(DataTable dt) { if (dt.Rows.Count == 0) { return ""; } StringBuilder jsonBuilder = new StringBuilder(); jsonBuilder.Append("["); for (int i = 0; i < dt.Rows.Count; i++) { jsonBuilder.Append("{"); for (int j = 0; j < dt.Columns.Count; j++) { jsonBuilder.Append("\""); jsonBuilder.Append(dt.Columns[j].ColumnName); jsonBuilder.Append("\":\""); jsonBuilder.Append(dt.Rows[i][j].ToString()); jsonBuilder.Append("\","); } jsonBuilder.Remove(jsonBuilder.Length - 1, 1); jsonBuilder.Append("},"); } jsonBuilder.Remove(jsonBuilder.Length - 1, 1); jsonBuilder.Append("]"); return jsonBuilder.ToString(); } } /// <summary> /// 写成DataTable的扩展方法是这样 /// </summary> public |
请发表评论