浑沌的JSON,JS Object,JS Array

正确的json格式好像是这样{test:[{"id":"123"},{"id":"123"},{"id":"2222"}]}


对于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 " : " 123 4" ,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》,夯实基础吧,有了基础,一切尽在掌握。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值