以前對json的了解並不是很清楚,因為使用很少,所以也沒有特意的研究。只知道json是輕量級的數據交換格式,可以被多種語言方便的處理,也是大型門戶站接口使用的主要數據格式。
而最近做了個項目,涉及到json數據的操作。發現json其實挺簡單。
本文是自己在開發過程中對json的理解及使用,有錯誤的地方,也請大家多多指正。
在學習處理json數據之前,需要對js中的數組和靜態對象的定義了解一下。
js中數組的定義
//定義1維數組,包含三個元素
var arr = new Array(“1″, “2″, “3″);
//或
var arr2 = ["1","2","3"]; //以[]定義數組
//取值時
arr[0],arr[1],arr[2] //”1″,”2″,”3″ 對應的值.
//js的數組比較特殊,數組中的元素可以包含各種類型的元素。
如var arr3 = [["1","2","3"],”zhangsan”,2]; //arr3[0] 是數組,arr3[1]是字符型 arr3[2]是整形
類似於c#中
var arr = new object[3] {new object[3]{“1″,”2″,”3″}, “zhangsan”,2};
//我們可以很容易的使用js這種特性來定義數據類型。如下
var arr4 = [["zhangsan",18,"男"],["lisi",20,"男"],["wangwu",22,"女"]]; //二維數組
//如果需要使用數組中的元素,可以使用數組的下標。訪問也很方便。
arr4[0][0]; //zhangsan arr4[1][0] //lisi
但是只能使用下標訪問。如果數據嵌套的太多,就涉及到多維數據,理解起來會非常的麻煩。
js中靜態對象的定義
var PeopleInfo = { id: "1", //換成"id"也是一樣的 name: "zhangsan", ShowName: function () { console.log(PeopleInfo.name); } };
定義了一個靜態對象PeopleInfo,包括屬性值id,name,方法ShowName。
我們在使用時
訪問屬性:PeopleInfo.id,PeopleInfo.name
訪問方法:PeopleInfo.ShowName()
類似於c# 中的靜態類。
到這里js中的數組和靜態對象講完了。下面就開始本文的重點json
json是一種對象,也是一種數據格式,json的格式如下
1.基本格式
var json1={"id":1,"name":"zhangsan"}
2.嵌套格式
var json2 = { "id": 1, "name": "zhangsan", "address": { "address1": "地址1", "address2": "地址2" } };
3.數組嵌套格式
var json3 = { "id": 1, "name": "zhangsan", "address": [{ "address1": "地址1"}, {"address2": "地址2" }] };
這種定義是json里包含一個數組,而數組里又包含兩個json。訪問為嵌套的元素時,與上述說明相同,訪問嵌套元素時可以
json3.address[0].address1 //地址1
json3.address[0]["address1"] //地址2
我們在訪問json格式的數據時,只需要記住,如果是數組要用下標,如果是對象,可以用變量名也可以用屬性。
我們所遇到的json數據,無非是上述三種。也許遇到的會更復雜一下。如下:
var JsonObject = { "person1": { "id": 1, "name": "zhangsan", "address": { "address1": "北京1", "address2": "北京2"} }, "person2": { "id": 2, "name": "lisi", "address": { "address1": "上海1", "address2": "上海2" } } };
但是只要明白數組和對象的定義,分析起來也很容易,無非就是數據格式之間的嵌套。
對象JsonObject包含兩個對象person1,person2,person1與person2的結構相同,並分別包括兩個變量id,name和一個address對象。訪問時,只需按層次訪問就可以。例如
JsonObject["person1"]["address"]["address1"] //北京1
如果需要遍歷,遍歷json數據格式的方式如下:
function JsonLoop(json) { for (var key in json) { if (json.hasOwnProperty(key)) { if (typeof json[key]=="object") { JsonLoop(json[key]); }else { console.log("key:" + key + ", val:" + json[key]); } } } } //調用方式 JsoanLoop(JsonObject);
在.net中默認不支持json數據格式的讀寫,如果我們需要操作這種數據格式,可以分開來處理。
1.ajax中用json數據格式傳遞,ashx中接收,並作為參數處理,返回值為text類型。如
$.ajax({ url: "ajax/jsontest.ashx", data: {"id":1,"name":"zhangsan"}, //json數據格式 type: 'POST', success: function (data) { alert(data); } });
ashx使用的代碼,可以直接通過變量名來接收
int id = int.Parse(context.Request.Form["id"]); string name = context.Request.Form["name"]; context.Response.Write(string.Format("id={0},name={1}",id,name));
2.asp.net操作json數據
vs2012支持json的序列號和反序列化,但是之前的版本並不支持。所以我從google中搜索到Net.Json類(開源)。可以方便的操作json數據。
下載地址:http://sourceforge.net/projects/csjson/?source=dlp
Net.Json使用如下:
function TestJsonAjax() { $.ajax({ url: "ajax/jsontest.ashx", data: {"id":1}, //json數據格式 dataType: 'json', //設置數據類型 type: 'POST', success: function (data) { JsonLoop(data); }, //調用遍歷函數 error: function (data,error){alert(error+":"+data)} }); }
然后在ashx中接收id,並返回josn數據類型。
context.Response.ContentType = "application/json"; int id = int.Parse(context.Request.Form["id"]); JsonObjectCollection jsonObject = new JsonObjectCollection(); jsonObject.Add(new JsonStringValue("name","zhangsan")); jsonObject.Add(new JsonObjectCollection("address", new JsonObject[3] { new JsonStringValue("address1", "北京1"), new JsonStringValue("address2", "北京2"), new JsonStringValue("address3", "北京3") })); context.Response.Write(jsonObject.ToString());