C#Json數據交互


問題:寫項目時,難免會遇到前台和后台要進行數據交換,往前台傳一個對象或一個對象集,往后台傳一個對象,一個對象集。怎么傳,你當然不能直接去傳遞一個對象或對象集,我們可以利用JSON數據相互之間傳值。

Json在跨域之間傳數據也非常方法,這是它的優點。

你需要知道:傳遞數據我們用JSON,JSON,JSON,前台傳遞JSON數據格式到后台,后台需要反序列化。后台傳前台,需要序列化后傳。

簡單了解  JSon數據。

Json語法

在 JS 語言中,一切都是對象。因此, 任何支持的類型都可以通過 JSON 來表示,例如字符串、數字、對象、數組等。但是對象和數組是比較特殊且常用的兩種類型:
  • 對象表示為鍵值對
  • 數據由逗號分隔
  • 花括號保存對象
  • 方括號保存數組

JSON 鍵/值對

JSON 鍵值對是用來保存 JS 對象的一種方式,和 JS 對象的寫法也大同小異,鍵/值對組合中的鍵名寫在前面並用雙引號 "" 包裹,使用冒號 : 分隔,然后緊接着值:
{"firstName": "John"}
這很容易理解,等價於這條 JavaScript 語句:
{firstName = "John"}
 
 
最容易誤解的就是Json和JS里面的對象了
JSON 是 JS 對象的字符串表示法,它使用文本表示一個 JS 對象的信息,本質是一個字符串
知道了這一點區分JSON和JS對象就很簡單了。
例如:
  <script>
            var obj = { a: 'Hello', b: 'World' }; //這是一個對象,注意鍵名也是可以使用引號包裹的
            var json = '{"a": "Hello", "b": "World"}'; //這是一個 JSON 字符串,本質是一個字符串
            console.log(obj);
            console.log(obj.a);//JS對象可以直接用

            console.log(json);  //就是一個字符串
            console.log(json.a);  //JSON格式不好直接用,需要轉型
        </script>

 

 JS自帶方法可以讓我們再JSON和對象之間相互轉換
 <script>
          // 要實現從對象轉換為 JSON 字符串,使用 JSON.stringify() 方法:
//序列化
var json = JSON.stringify({ a: 'Hello', b: 'World' }); //結果是 '{"a": "Hello", "b": "World"}' console.log(json); // 要實現從 JSON 轉換為對象,使用 JSON.parse() 方法:
//反序列化
var obj = JSON.parse('{"a": "Hello", "b": "World"}'); //結果是 {a: 'Hello', b: 'World'} console.log(obj); </script>

   <script>
            //表示對象
            // JSON最常用的格式是對象的 鍵值對。例如下面這樣:
            var dd = { "firstName": "Brett", "lastName": "McLaughlin" };  
            console.log(dd.firstName);
            // 表示數組
            //和普通的 JS 數組一樣,JSON 表示數組的方式也是使用方括號 []
            var ff = {
                "people": [{
                    "firstName": "Brett",
                    "lastName": "McLaughlin"
                },
                 {
                             "firstName": "Jason",
                             "lastName": "Hunter"
                         }
                ]
            };
            console.log(ff.people[0].firstName);
        </script>

 

 

配合Aajx。

一條數據:

后台返回JSon數據,前台用

①字符串

 <script>
            $.ajax({
                type: "Post",
                url: "GetJson.ashx",
                data: "",
                dataType: "json",    //既然用到json,你就規定數據類型為json格式的 async: true,
                success: function (data) {
                    console.log(data);
                    console.log(data.Name);
                }
            })
        </script>
 public void ProcessRequest(HttpContext context)  //一般處理程序
        {
            context.Response.ContentType = "text/plain";
            //返回JSon格式數據
             string aa = "{\"Name\":\"李某\",\"Age\":\"18\"}";   //json格式必須為這個
            context.Response.Write(aa);   //這里返回JSon數據,前台接受變成了Object,如果前台是string類型就轉成對象。
}

 

如果我們的JSON字符串很復咋,這樣寫字符串不太好。

 

②自帶命名空間序列化

 context.Response.ContentType = "text/plain";
            //可以序列化和反序列化
            JavaScriptSerializer json = new JavaScriptSerializer();
            FunctionDemo.Model.Users usModel = new FunctionDemo.BLL.Users().GetModel(2);
            context.Response.Write(json.Serialize(usModel));
            $.ajax({
                type: "Post",
                url: "GetJson.ashx",
                data: "ob="+JSON.stringify(ob)+"&js="+js,
                dataType: "json",
                async: true,
                success: function (data) {
                    console.log(typeof (data));
                    console.log(data);
                    alert(data.LoginName);
                },
                error: function () {
                    alert(" 錯了");
                }
            })

 

 

 

 

③借助我們的     這個dll    ———>      下載地址

  public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            ////返回JSon格式數據
            // string aa = "{\"Name\":\"李某\",\"Age\":\"18\"}";   //json格式必須為這個
            //context.Response.Write(aa);   //這里返回JSon數據,前台接受變成了Object
 //可以把一張表的字段和值這樣寫
            JsonData jd = new JsonData();      JsonData.doc介紹 
            jd["Name"] = "李某";         
            jd["Age"] = 18;
            context.Response.Write(jd.ToJson());   //這個跟上面的字符串JSon效果是一樣的 可以簡化我們的JSon字符串
        }

可以返回嵌套的

 //返回JSon格式數據
            string aa = "{\"Name\":\"李某\",\"Age\":\"18\",\"Love\":[{\"one\":\"運動\",\"two\":\"哦哦\"},{\"one\":\"看電影\"}]}";   //json格式必須為這個
            context.Response.Write(aa);   //這里返回JSon數據,前台接受變成了Object
  <script>         

            $.ajax({
                type: "Post",
                url: "GetJson.ashx",
                data: "",
                dataType: "json",
                async: true,
                success: function (data) {
                    console.log(data);
                    console.log(data.Name);
                    console.log(data.Love[0].one);
                }
            })
        </script>

 

 

 

 

發現問題:

不管是我們手寫Json字符串,還是利用JsonData轉成JSON格式,你會發現都需要你去構造,如果你需要得到一張表,並且列很多,你要寫到什么。並且有個很嚴重的缺點,就是獲取多條數據的時候改怎么處理,很麻煩。以上的只能使用與小量數據,還好我們知道一個dll可以很好的解決這個問題。

④這個dll之前也用過,就是 Newtonsoft.Json   下載地址:點擊

我們的來看看列子。

  public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            //  DataSet ds = new FunctionDemo.BLL.Users().GetList("");
            FunctionDemo.Model.Users usModel = new FunctionDemo.BLL.Users().GetModel(2);
            //  JsonConvert.SerializeObject  這個靜態方法  翻譯就是序列化對象 
            context.Response.Write(JsonConvert.SerializeObject(usModel));    //不能直接返回一個對象,或一個數據集
        }
 <script>         
          
            $.ajax({
                type: "Post",
                url: "GetJson.ashx",
                data: "",
                dataType: "json",
                async: true,
                success: function (data) {
                    console.log(typeof(data));
                    console.log(data);
                   
                },
                error: function () {
                    alert(" 錯了");
                }
            })
        </script>

   public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
             DataSet ds = new FunctionDemo.BLL.Users().GetList("");
            FunctionDemo.Model.Users usModel = new FunctionDemo.BLL.Users().GetModel(2);
            //  JsonConvert.SerializeObject  這個靜態方法  翻譯就是序列化對象 
            //可以自己打造一個對象,把需要的數據填寫進去   這個位子很靈活需要根據你想要的進行處理
            //也可以打造一張表   就可以添加很多數據了  
            var dd= new { Name = usModel.LoginName, Age = 18, Sex = "" };        

            context.Response.Write(JsonConvert.SerializeObject(dd));
        }

多條數據

   public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
             DataSet ds = new FunctionDemo.BLL.Users().GetList("");
            FunctionDemo.Model.Users usModel = new FunctionDemo.BLL.Users().GetModel(2);
            //  JsonConvert.SerializeObject  這個靜態方法  翻譯就是序列化對象             

            context.Response.Write(JsonConvert.SerializeObject(ds.Tables[0]));
        }
 <script>         
          
            $.ajax({
                type: "Post",
                url: "GetJson.ashx",
                data: "",
                dataType: "json",
                async: true,
                success: function (data) {
                    console.log(typeof(data));
                    console.log(data);
                    console.log(`姓名:${data[0].LoginName}`);                 

                },
                error: function () {
                    alert(" 錯了");
                }
            })
        </script>

 

 總結:在后台獲取數據返回時需要序列化成JSON格式的數據,在前台接收時可用先看下數據類型,如果是JSON數據格式就轉下型,無非就是Eval(data)和JSon.Pase(data)。

在后台我們返回JSON字符串,在前台我們需要變成Object.

 

前台返回JSON數據后台接收

  這個前台都是一樣的,下面主要看看后台怎么反序列化數據

 <script> 
            var ob = { "LoginName": "李某", "PassWord": "159" }; //對象    這里的屬性跟你的類字段一樣的,不要自己瞎起名字
            var js = '{"LoginName":"社會我李哥","PassWord":"哦"}'; //JSON
           //傳遞的數據必須為JSON格式的
          //把對象轉成JSon字符串傳進入
            $.ajax({
                type: "Post",
                url: "GetJson.ashx",
                data: "ob="+JSON.stringify(ob)+"&js="+js, //測試傳一個對象,不轉型的時候,后台無法處理,所以傳遞必須為JSON數據格式 一個,數組都可以
                dataType: "json",     
                async: true,
                success: function (data) {
                    console.log(typeof (data));
                    console.log(data);
                    alert(data.LoginName);
                },
                error: function () {
                    alert(" 錯了");
                }
            })
        </script>

后台:

            string ob = context.Request.Form["ob"];// "{\"LoginName\":\"李某\",\"PassWord\":\"159\"}"
            string js = context.Request.Form["js"];// "{\"LoginName\":\"社會我李哥\",\"PassWord\":\"哦\"}"

            //下面需要做的就是把JSON轉成對象(一個確定的對象)

            //①自帶的
            JavaScriptSerializer json = new JavaScriptSerializer();
            //反序列化,主要他需要的參數,如果是數據集 就換成 List<T> 
            FunctionDemo.Model.Users one = json.Deserialize(ob, typeof(FunctionDemo.Model.Users)) as FunctionDemo.Model.Users;

            //②dll    typeof(T) 這個參數一個要帶,不然成功不了  
            FunctionDemo.Model.Users model = JsonConvert.DeserializeObject(js, typeof(FunctionDemo.Model.Users)) as FunctionDemo.Model.Users;
                //或者 JsonConvert.DeserializeObject<FunctionDemo.Model.Users>(js);
//如果你傳遞的JSON數據沒有確切的類型來接受,你自己可以在上面寫一個 class ,屬性值更你傳遞過來的屬性是一一對應的就行

經過測試獲取成功

 

總結:前台傳數據之前就需要轉成JSON格式,后台才好反序列化。

到此Json傳遞數據就完了。

 
 要點:傳遞的參數是JSON類型,接受成功了轉成對象使用
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM