浑沌的JSON,JS Object,JS Array

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

原文地址:https://www.cnblogs.com/showker/p/1585118.html