对于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[] { '$'},StringSplitOptions.RemoveEmptyEntries);
foreach (string i in arrJson)
{
Wo.bolUpAllSql("update shell set "+i);
}
}
.net的反序列化类没弄明白,第三方的.dll又没整出来。只好自己用JS解析。
当然通过$分割3个SQL语句还是有风险,万一SQL语句里就有$呢?解决办法就是,在js循环中调用Ajax 执行UpdateTable.aspx.cs ,
当然UpdateTable.aspx.cs 就要改动成不需要循环的。
根基不牢,地动山摇,看着技术一天发展,我们缺没法跟上,叹息之余,只有自我安慰:回过头来看看《深入浅出JavaScript》,夯实基础吧,有了基础,一切尽在掌握。