對於JSON,從未真正完整學習過,只是在做公司OA時,因為使用到了ExtJS,才略有耳聞。昨日,碰到一個以前從未碰到的問題,就是前台的 JSON字符串傳到後台如何解析的問題。以前都是後台的數據變成JSON字符串傳到前台由ExtJs自己解析。這回不一樣了,順序剛剛相反。由於使用的是.net 2.0的,沒有傳說中3.5自帶的JSON解析類,所以便到網上下載了個newstonsoft的JSON.Net。引入dll後,搗鼓半天沒出來我想要的結果。 我前台的返回的JSON字符串是:
[{"id":"123","home":"256","temp","240"},{"id":"254","home":"600"},{"id":"1234",temp","240"}]
,而我後台想要的是把它們解析成如下的SQL語句
update tableExample set home='256',temp='240' where id='123'
update tableExample set home='600' where id='254'
update tableExample set temp='240' where id='1234'
說真的,我不知道上述的字符串算不算JSON字符串,因為我還看到過{[{"id":"123"},{"id":"123"}, {"id":"2222"}]}這樣的格式。但是我知道那個JSON字符串在JS裡其實就是個Array,而這個Array的內容就是3個JS Object:
回過頭來,我們看看JS裡如何定義Array和Object。
定義Array.
var varArray=new Array();
或者直接賦值
var varArray=new Arrau(["Apple","Pear","Orange"]) ;
定義Object
var varObject=new Object();
或者直接賦值
var varObject=new Object({"id":"123","home":"256","temp","240"});
這樣看我剛剛那個JSON字符串,也可以這樣賦值給一個Array,因為它符合數組格式-用[]括起來,同時裡面的元素用字符,隔開,不是嗎?
var varArrau=new Array([{"id":"123","home":"256","temp","240"},{"id":"254","home":"600"},{"id":"1234",temp","240"}])
這裡我們可以看出JS裡的數組裡的內容可以是任何東西,包括Object。
那我們這樣推論JSON其實就是JS格式的Array與Object的混裝。那麼談到這裡要解決實際問題,該這麼把那串字符串變成我想要的SQL語句呢?用正則?Split拆分?
我的天啊。那都是頭疼的事情。其實我們剛剛已經分析過了,那串JSON字符串其實就是一個數組,而數組裡放了3個Object。那我們為何不直接用JS遍歷一下這個數組,把裡面的Object取出來,再遍歷裡面的Object,把Object的屬性及值取出來呢?JS腳本如下:
var pageDto = new String();
var varChangeId = new Array();
pageDto = pageDto.concat("[");
for (var i = 0; i < updateDate.length; i++) {
varChangeId.push(updateDate[i].data.id);
pageDto = pageDto.concat(Ext.encode(updateDate[i].getChanges())); // GetChanges獲得修改過的字段和value
if ((i + 1) != updateDate.length) {
pageDto = pageDto.concat(",");
}
}
pageDto = pageDto.concat("]");//這裡的pageDto就是上文提到的JSON字符串了
var xxx = new Array();
var varTotalSql = "";
xxx = Ext.util.JSON.decode(pageDto);
for (var i = 0; i < xxx.length; i++) {//第一個循環是循環3個Object
for (m in xxx[i]) {//第二個循環是循環每個Object裡的屬性及值。
varTotalSql += m + "='" + xxx[i][m] + "',";//屬性與值拼湊成SQL中需更新的字段
}
varTotalSql = varTotalSql.substring(0, varTotalSql.length - 1);// 去掉最後一個,
varTotalSql += " where id='" + varChangeId[i] + "'$";//得到3個SQL語句,通過$號隔開。
}
得到的字符串在後台通過Split分割$,得到一個數組,然後循環執行更新數據庫。
UpdateTable.ASPx.cs
protected void Page_Load(object sender, EventArgs e)
{
Response.Clear();
SQLdal.ShellUrl Wo = new SQLdal.ShellUrl();
string strJSon = Request.Params["testP"].ToString();
string[] arrJson = strJSon.Split(new char[] { '},String
.Net的反序列化類沒弄明白,第三方的.dll又沒整出來。只好自己用JS解析。
當然通過$分割3個SQL語句還是有風險,萬一SQL語句裡就有$呢?解決辦法就是,在JS循環中調用AJax 執行UpdateTable.ASPx.cs ,
當然UpdateTable.ASPx.cs 就要改動成不需要循環的。
根基不牢,地動山搖,看著技術一天發展,我們缺沒法跟上,歎息之余,只有自我安慰:回過頭來看看《深入淺出JavaScript》,夯實基礎吧,有了基礎,一切盡在掌握。