JSON,Object,Array对比
json 由于以前没有怎么使用,对其只是听说没有认识...这几天需要做用到json 需要把前台的json传到后台(C#层)进行解析.找了一些资料...发现.net3.5有自带的json解析类..而我用的是2.0没有该类...所以上网找了一个dll(json.net) 搞了半天,没有出来想要的结果...
我的前台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 就要改动成不需要循环的。

