• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

JSON之Asp.netMVCC#对象转JSON,DataTable转JSON,List转JSON,JSON转List,JSON转C#对 ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
        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  

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap