有關於Javascript在JSON資料方面的實作
JSON是現代Open Data精神下,得以流通在HTTP協定下的產物,他強調資料的單純傳輸的概念下,讓宣告繁複的XML產生了極大的衝擊,有鑑於人老了每次要宣告比較複雜的JSON Object都會忘記的情況下,把一些資料整理在這邊日後好回憶。
利用Javascript宣告一個物件,並操作之:
//定義
var myCar = {
"Name": "BMW",
"Number": "GY-5978",
"Specification": [{
"model" : "A",
"length": 100,
"weight": 200
},{
"model" : "B",
"length": 300,
"weight": 400
}
]
};
//操作
myCar.name = "Mercedes Benz";
myCar.Specification[0].weight = 250;
myCar.Specification[1].length = 350;
操作完當然是用AJAX把他給POST出去了,如果你在jQuery中要AJAX直接把這個myCar物件帶進去POST,那麼jQuery會自動幫你轉成name=Mercedes%20Benz&Number=GY-5978...等資訊丟出去,這通常不會是我們要的,因此你需要調用JSON.stringify()來進行轉換嘍!這個動作在現代的程式語言中通常稱為「序列化」。
$(document).ready(function(){
$("#btnSubmit").click(function(){
$.ajax({
url: "http://your.url/",
type: "post",
contentType: "application/json", //注意!單靠這一行是不會幫你自動轉換JSON的
dataType: "json", //注意!單靠這一行也是不會幫你自動轉換JSON的
data: JSON.stringify(myCar), //注意!這一行直接帶myCar是不會幫你自動轉換JSON的
timeout: 3000, //等候3秒逾時
beforeSend: function () {
//送出前
},
success: function (oDataResponse) {
//成功
if (oDataResponse.length != 0) {
$(oDataResponse).each(function (i, v) {
//處理
});
}
},
error: function (xmlhttprequest, textstatus, message) {
//失敗
if (textstatus == "timeout") {
//逾時
} else {
//其他錯誤
}
}
});
});
});
值得一提的是,在success後傳回的data,如果你是使用jQuery的情況下,可以直接使用像data.success之類的方式來調用回傳資訊。如果你是屬於比較小心一點的使用者,那麼可以考慮使用JSON.parse()來驗證一下嘍!
下方式宣告一個單一陣列型的物件,經過JSON.parse()無誤後,開始使用的範例。
var pets = '[{"name":"jack"}, {"name":"john"}, {"name":"joe"}]';
var arr = JSON.parse(pets);
alert(arr[0].name);
那麼,在伺服器端如何取出,並將JSON字串轉回物件呢?
很簡單,先直接串流把資料讀進來後,請我們的好朋友JSON.NET來幫忙即可(在這裡沒有另外建立ORM,而是採用匿名型別來餵給JSON.NET)。
var oData = new {
Name = "",
Number = "",
Specification = new[] { new { model = "", length = -1, weight = -1 } }
};
try
{
using (System.IO.StreamReader oSR = new System.IO.StreamReader(Request.InputStream))
{
string cTemp = oSR.ReadToEnd();
Newtonsoft.Json.Linq.JObject.Parse(cTemp); //如果JSON驗證沒通過,會丟Exception錯誤
oData = Newtonsoft.Json.JsonConvert.DeserializeAnonymousType(cTemp, oData);
}
}
catch
{
//DoSomething...
}