zoukankan      html  css  js  c++  java
  • 将非常规Json字符串转换为常用的json对象

      如下所示,这是一个已经转换为Json对象的非常规Json字符串,原来是一个Json类型的字符串,在转换为Json对象时,查询资料发现有两种转换法,.parse()和.eval()方法,但是前辈们都极其不推荐使用后者,因为它不会检查Json格式的正确与否,还能将可执行的代码直接执行了,是极其危险的。而前者当数据不符合Json字符串格式时,会报错提示!!详解的可以搜其他大神的笔记查看。 
    下面的各个字段没有像我们直接能使用的key-value键值对这样一一对应的json对象。

      各key值意义如下: 
        Count:表示数据有一行; 
        Field:此数组元素为我们所需要的真正key值; 
        Row:数据数组,根据Count值而定,如果Count:n,则有n个Row(即有n行), 
        其中Type是表明数据类型,后面第二个关键字相当于数据类型名,其值为真正的key值所对应的value值。 
      最后解析之后,我们想要的应该是: {channel:1,on_off:1,freq:”1950.0000MHz”,sweep:”10.0000MHz”} 

    { 
        Count:1,
        Field:["channel","on_off","freq","sweep"],
        Row:[{
           VolVal:[
             {Type:6,iVal:1},
             {Type:7,dwVal:1},
             {Type:10,strVal:"1950.0000MHz"},
             {Type:10,strVal:"10.0000MHz"}
           ]    
          }]
      
    
    
    
    

      看到这个的时候还是有点蒙圈的,感觉解析出来还麻烦甚至不知道怎么弄。自己的第一反应就是一点一点直接取出来得什么时候去了,总想着有什么简单而又简便的方法一步到位。然而事实是没有什么捷径,通过这个又get到一点,不要怕麻烦,也不要被这种吓到了,一层一层解析就好。然后,下面的代码则是我尝试解出的过程:

    <script>
      var a={
         Count:1,
         Field:["channel","on_off","freq","sweep"],
         Row:[{
            VolVal:[
            {Type:6,iVal:1},
            {Type:7,dwVal:1},
            {Type:10,strVal:"1950.0000MHz"},
            {Type:10,strVal:"10.0000MHz"}
            ]}
         ]
      };
      var form = []; //定义一个数组用来存储数据,因为可能不只一行数据
      var c = a.Count; //数据行数
      var field = a.Field;
      for(let j = 0; j < c ; j++)
      {
        var r = a.row;
        var data  = r[j];  //取每一行数据
        var col = data.ColVal; //每一行中的四组数据对象
        for(let i = 0; i < col.length; i++)
        {
          var name = field[i];//取出key值
          var colValue =col[i];//取出每一个数据对象
          var type = colValue.Type;//取出每个数据对象value的数据类型
          var value = 0;
          var obj = {};//用来向数组中push存储多个对象元素
          switch(type)
          {
             case 6:
                  value = colValue.iVal;break;
             case 7:
                  value = colValue.dwVal;break;
             case 10:
                  value = colValue.strVal;break;       
          }
           obj = {name:value};//**想要将值以key value的形式存储起来??**
           form.push(obj);
        }
    
      }
      </script>
    
    
    
    

      我的难点是,不知道怎么将解析出的结果,将key和value都存放到Json数组对象中去??

      上面的代码原意是想每一次循环将key-value都存到新建的obj对象中,最后将对象push进form数组中存储起来。然而却发现得到的结果是: 
        [Object]:即[name:”10.000KHz”] 
      分析原因我们发现: 
    这里写图片描述

      因此正确的处理应该是: 
    这里写图片描述

      即将obj{}对象定义放到内层循环外,每一行数据则是一个对象,且因为obj的键名是动态生成的,不能用“.”表达式,“.”表达式代表后面所跟的是常量,因此最后出来的会报错。。 
      因此一定要特别注意“.”和“[]”的区别使用法!!

      取出的Json对象数据为: 
    这里写图片描述

    声明:本博文由博主Bonjourjw(http://blog.csdn.net/bonjourjw)原创编辑,我经其同意后转载过来供大家交流学习,未经其同意禁止转载!

  • 相关阅读:
    使用用Ghost制作的win2k3和winxp文件具有相同的SID的解决办法
    64 bits Windows 7 使用 regsvr32 的註冊方式(转)
    怎么实现用户匿名访问web,但数据库要用Windows集成验证方式(数据库和web服务器分别在两台机器上)
    为什么按照微软给定的匿名配置Web 同步最终造成创建订阅的步骤总是失败?但改为需要身份验证就行了
    How to edit Team Build Types
    利用WhiteHose一步步建立分布式系统的框架(二)创建LDD步骤
    发现:InfoPath 2007 Training Labs地址
    在MSF中怎么区分易混淆的工作项类型:Bug、风险和问题(我个人的理解)
    RGB Colour Map
    How to distinguish Design time or Running time in Mobile cusotmer Contorl(the NetCF2.0 is different to NetCF1.0)
  • 原文地址:https://www.cnblogs.com/zimo-jing/p/7828077.html
Copyright © 2011-2022 走看看