zoukankan      html  css  js  c++  java
  • 浑沌的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》,夯实基础吧,有了基础,一切尽在掌握。

  • 相关阅读:
    GC垃圾回收算法
    Docker+nginx部署Springboot+vue前后端分离项目
    报错 ImportError: cannot import name 'AsyncContextManager'
    Python+Selenium定位不到元素(报错:selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element)
    淘宝网的发展史及其优缺点
    Python旅途——函数(1)
    正则表达式 -允许输入数字和小数点后两位
    表单的resetFileds函数重置为初始值而非清空数据
    做一个全局登录弹窗,任何地方访问
    浏览器到服务器的跨域问题
  • 原文地址:https://www.cnblogs.com/showker/p/1585118.html
Copyright © 2011-2022 走看看