zoukankan      html  css  js  c++  java
  • .NET中如何使用反序列化JSON字符串/序列化泛型对象toJsonStr

    在进行 .NET Web MVC 框架开发的网站程序的时候,我们都会遇到最关键的问题,数据传输。

     

    .NET MVC 4中的ControllerBase类建议我们用ViewBag动态数据字典形式(type:dynamic,JavaScript就是动态语言,只在运行时候才进行类型判断,而不是在编译),或者用ViewData数据字典(type:dictionary<string,object>)形式返回我们绑定的值。也就是说,ViewBag存储的数据的类型都是在使用的时候才确定的,但是ViewData的数据在创建对象的时候就已经确定了。具体区别不做赘述。

     

    但是,这样绑定会有一定的局限性,因为网页上展示的多样化,使得上述方式复杂。比如:一个列表上显示了5条数据,又需要展示10条,我们就不能用mvc的类来解决了。更好的解决方式还是用AJAX+JS来解决,

     

    AJAX可以处理很多类型的数据,目前JSON因为其轻量且直观方便广泛的被应用在数据传输上,后台程序提供JSON数据,前台利用JS进行处理就可以完成很多我们想做的操作。

    1)序列化,顾名思义,使之变得有序,在程序中就可以理解为将一个指定对象变成了JSON键值对

    后台代码由于.NET的类库我们可以轻松完成。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using System.Web.Script.Serialization;
    using System.Runtime.Serialization;
    using System.Runtime.Serialization.Json;
    
    namespace Controllers
    {

    [Serializable]
    [DataContract]

    public class NewsOperationsController : Controller

    {

      public ActionResult Index(){
    List<T> rult = new List<T>();//创建泛型对象LIST //利用MVC的json方法直接序列化对象
    return Json(rult, JsonRequestBehavior.AllowGet); }
    }


    }

    前台需要的是发送请求,然后处理JSON字符串

     1   
     2  function getData() {
     3           
     4    $.post(appURL + "NewsOperations/index/" , {}, function (data) {
     5   
     6    //将json对象转化为JSON字符串  
     7     var  myJson= JSON.stringify(data);
     8    
     9   console.log(myJson);     
    10 
    11 
    12  }, "json");
    13         }

    2)反序列化

    反序列化得步骤恰恰相反,但是更为复杂

    后台接受前台的数据,有两种方式

    1)通过ajax的data传送json键值对/通过form提交/或者直接写在URL后面,但是这样有一个不好之处,在后台仍然需要对数据一个一个处理,也就是说,在后台需要创建对象在为其一一赋值

    2)前台加大代码量,拼凑JSON对象,发送至后台直接进行反序列化处理,为对象赋初始化。

    第一种方法较为常见,第二种是我自己想尝试而为之的,也分享一下。

    前台:

     1  //提交信息,采用拼接JSON字符数组数据提交,为后台反序列化提供数据
     2     
     3 function submitPage() {
     4             
     5 var da = new Date();
     6 //获取现在时间
     7 var Now = da.getFullYear() + "-" + da.getMonth() + "-" + da.getDate() + " " + da.getHours() + ":" + da.getMinutes() + ":" + da.getSeconds();
     8 //随便写一些数据举例
     9 var data=[1,2,3,4,5,6];
    10 //拼接字符串 ps: 必须写成 [{"a":b,"c":d...}]形式,因为反序列化以数组为单位,[]代表一个数组对象,每个{}代表一个JSON对象
    11 var json = "";
    12 json += "[{";
    13 json += ""NewsID":" + data[0] + ",";
    14 json += ""NewsTitle":"" +  data[0] + "",";
    15 json += ""NewsContent":"" + data[0] + "",";
    16 json += ""ReporterName":"" +  data[0] + "",";
    17 json += ""ReporterName":"" +  data[0] + "",";
    18 json += ""CategoryName":"" + data[0] + "",";
    19 json += ""Createtime":"" + Now + """;
    20 json += "}]";
    21 
    22 if (confirm("是否提交!") == true) {   
    23              
    24  $.post(appURL + "NewsOperations/submit", {index:json }, function (data) {
    25                 
    26      if (data.Success) {
    27            alert("提交成功");
    28                  
    29         } else {
    30            
    31             alert("提交失败");
    32                     }
    33                 }, "json");
    34 
    35             } else {            
    36             }           
    37         }

    后台处理,需要用到一个静态类

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Web;
     5 using System.Web.Mvc;
     6 using System.Web.Script.Serialization;
     7 using System.IO;
     8 using System.Text;
     9 using System.Runtime.Serialization;
    10 using System.Runtime.Serialization.Json;
    11 
    12 namespace controllers{
    13 public static class deserialize
    14     {
    15 //返回一个指定类型的LIST对象
    16       public static List<T> JSONStringToList<T>(this string JsonStr)
    17         {
    18             JavaScriptSerializer Serializer = new JavaScriptSerializer();
    19            
    20              List<T> objs = Serializer.Deserialize<List<T>>(JsonStr);
    21            
    22              return objs;
    23         }
    24 //返回一个类型的对象
    25         public static T Deserialize<T>(string json)
    26         {
    27             T obj = Activator.CreateInstance<T>();
    28             
    29             using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
    30             {
    31             DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
    32              
    33             return (T)serializer.ReadObject(ms);
    34             }
    35         }
    36 
    37     }
    38 
    39 
    40  public ActionResult submit(string json)
    41  {
    42 
    43  //反序列化JSON字符,初始化对象
    44    List<T> model = deserialize.JSONStringToList<T>(json);
    45  //....后续就可以自己操作啦!!
    46 
    47 }
    48 
    49 }


    到这里,json的反序列化和序列化就讲完了,欢迎各位大神拍砖!小弟还没入行,学习ING,请多指教!

    兴趣爱好:guitar , sing , and so on

    本人QQ:601761267
    EXP int identity primary
  • 相关阅读:
    java接入钉钉机器人(带源码)
    使用java做一个能赚钱的微信群聊机器人(2020年基于PC端协议最新可用版)
    侠说java8--Stream流操作学习笔记,都在这里了
    Elasticsearch调优篇-慢查询分析笔记
    网络探测和抓包工具 wireshark
    window10远程ubuntu18.04
    springdataJPA mysql myisam innodb
    命令集
    java tmpdir 启动 kafka 命令行
    java jar 启动命令
  • 原文地址:https://www.cnblogs.com/Hal-tan/p/5283129.html
Copyright © 2011-2022 走看看