問題:寫項目時,難免會遇到前台和后台要進行數據交換,往前台傳一個對象或一個對象集,往后台傳一個對象,一個對象集。怎么傳,你當然不能直接去傳遞一個對象或對象集,我們可以利用JSON數據相互之間傳值。
Json在跨域之間傳數據也非常方法,這是它的優點。
你需要知道:傳遞數據我們用JSON,JSON,JSON,前台傳遞JSON數據格式到后台,后台需要反序列化。后台傳前台,需要序列化后傳。
簡單了解 JSon數據。
Json語法:
-
對象表示為鍵值對
-
數據由逗號分隔
-
花括號保存對象
-
方括號保存數組
JSON 鍵/值對
<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>

<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傳遞數據就完了。
