JSON序列化与反序列化

序列化与反序列化

前台(jQuery):

var objP = {};
            objP.id = 1;
            objP.name = 2;
            objP.sex = 32;
JSON.stringify(objP)//序列化
JSON.parse(e); //JSON.parse(e)反序列化

 后台(.net自带):

Person pp = new Person();
            pp.id = "33";
            pp.name = "44";
            pp.sex = "true";
            vare = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(pp);
            vard = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<Person>(e);

//前面的new不要忘了

 

后台(JSON.NET):

Person pp = new Person();
            pp.id = "33";
            pp.name = "44";
            pp.sex = "true";
var a = Newtonsoft.Json.JsonConvert.SerializeObject(pp);
var e = Newtonsoft.Json.JsonConvert.DeserializeObject<Person>(a);

 

在前面的两种后台序列化和反序列化中,后都JSON.NET被证实比VS自带的效率要高,但是它们都要在前面加上一长串,这给实际的开发带来了不便,因此有必要对其进行封装。下面以JSON.NET为封装对象:

新建一个类JSONNet.cs

public classJSONNet
    {
        //序列化将某个对象 value序列化成字符串
        public static stringSerializeObject(object value)
        {
            returnNewtonsoft.Json.JsonConvert.SerializeObject(value);
        }
        //反序列化将已被序列化的字符串 value反序列化到某个对象当中
        public static T Deserialize<T>(string value)
        {
            returnNewtonsoft.Json.JsonConvert.DeserializeObject<T>(value);
        }
    }

 

此时,再要进行序列化和反序列化时就可这样使用:

Person pp = new Person()
{
id = "20id",
name = "30name",
sex = "40sex"
};
var g = JSONNet.SerializeObject(pp);
var h = JSONNet.Deserialize<Person>(g)

 

序列化与反序列化的前台格式  对象Or集合

无论是前台还是后台进行序列化和反序列化,它们的前提就是要有值提供给它们操作。通常使用到序列化的有两种常况:一个是对象(类),一个List<>。

在为类对象时,前台JS中这样定义:

var objP = {};
            objP.id = "id";
            objP.name = "name";
            objP.sex = "sex";

 

注意自定义对象后面的是大括号。此时,后台应该有一个类的字段名与objP的自定义属性名相对应,能对应上多少,在反序列化时就能得到多少字段的值。后台那个类通常时根据此时要上传的对象的字段来定义的。

在为List<>时,前台JS中这样定义:

var objO = [];
            objO.push(1);
            objO.push(2);
            varobjP = {};
            objP.id = objO;

 

经序列化后 接收到的值为:{\"id\":[1,2]}。这个时候后台还需要有一个类lp,它的有一个名为id的List<string>字段

public classlp
    {
        public List<string>id;
    }

 

同样的,var i = JSONNet.Deserialize<lp>(p);

红色部分要对应

在.NET MVC中,当返回序列化字符串时,控制器的返回类型应为 string 。当使用MVC的序列化时,可直接使用ActionResult

 

前台接收前显示序列化后的内容

在前台页面中,接收到服务器返回的内容后通常不需要再进行反序列化,可直接使用,如:后台有这样一个类,取值后被序列化,并返回到前台页面中:

    public class BuViewModel
    {
        public string Id { get; set; }
        public List<User>listU { get; set;}
    }

 

那么,在前台页面中可这样做:

success: function (e) {
                //直接取一般字段
                    $("#Id").val(e.Id);
//通过循环遍历List<>前附加
for (var i = 0; i< e.St.length; i++) {
                        var appendStr ="<optionvalue='" + e. listU [i].EmployeeId +"'>"+ e. listU [i].DisplayName + "</option>";
                        $("#st").append(appendStr);
                    }
}

 

完整代码如下:

前台:

<head>
    <title>Index</title>
    <script src="../../Scripts/jquery-1.5.1.min.js" type="text/javascript"></script>
        <script type="text/javascript">
        $(function () {
            var objP = {};
            objP.id = 1;
            objP.name = 2;
            objP.sesx = 32;
            $.ajax({
                cache: false,
                url: "/Base/GetIndex/",
                data: objP,//直接将在JS中的自定义对象发过去,自定义对象中的“属性”(字段名)必须和后台接收的实体的字段名一至
                success: function (e) {
                    alert("Success");
                },
                error: function () {
                    alert("Error...");
                }
            });
        });
    </script>
    
    <script type="text/javascript">
        $(function () {
            var objO = [];
            objO.push(1);
            objO.push(2);

            var objP = {};
            objP.id = objO;
            // objP.id = "id";
            //objP.name = "name";
            //objP.sex = "sex";
            $.ajax({
                cache: false,
                url: "/Base/GetJsonIndex/",
                data: { "p": JSON.stringify(objP) },
                success: function (e) {
                    console.log(e);
                    console.log(JSON.parse(e)); //JSON.parse(e)反序列化
                    alert(e.id);
                    alert("Success");
                },
                error: function () {
                    alert("Error...");
                }
            });
        });
    </script>
</head>

后台:

public class BaseController : Controller
    {
        //
        // GET: /Base/

        public ActionResult Index()
        {
            return View();
        }

        [HttpGet]
        public ActionResult GetIndex(Person p)//直接获取对象
        {
            var a = p;
            var b = a.id;
            var c = a.name;
            var d = a.sex;
            return View();
        }

        [HttpGet]
        public string GetJsonIndex(string p)
        {
            
            var i = JSONNet.Deserialize<lp>(p);

            Person pp = new Person()
                            {
                                id = "20id",
                                name = "30name",
                                sex = "40sex"
                            };
            var e = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(pp);
            var d = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<Person>(e);
            var a = Newtonsoft.Json.JsonConvert.SerializeObject(pp);
            var f = Newtonsoft.Json.JsonConvert.DeserializeObject<Person>(a);
            var g = JSONNet.SerializeObject(pp);
            var h = JSONNet.Deserialize<Person>(g);
            
            var b = Json(pp, JsonRequestBehavior.AllowGet);
            return e;
        }
    }




  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值