在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式:使用eval()函数、使用Function对象来进行返回解析,下面有个示例,在使用ajax请求后台数据的时候会出现missing ] after element list的问题,今天出现这个问题所以我就探究了下
介绍
- 在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式:
 
- 一种为使用eval()函数。 
 
- 使用Function对象来进行返回解析。
 
- 使用eval函数来解析,并且使用jquery的each方法来遍历 
 
- 用jquery解析JSON数据的方法,作为jquery异步请求的传输对象,jquery请求后返回的结果是json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,对于利用JSONObject等插件封装的JSON对象,与此亦是大同小异,这里不再做说明。
 
第一种情况
- 对于服务器返回的JSON字符串,如果jquery异步请求没做类型说明,或者以字符串方式接受,那么需要做一次对象化处理,方式不是太麻烦,就是将该字符串放于eval()中执行一次。这种方式也适合以普通javascipt方式获取json对象
 
JSON字符串集
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
   | var data="{    root: [  	{name:'1',value:'0'},  	{name:'6101',value:'北京市'},  	{name:'6102',value:'天津市'},  	{name:'6103',value:'上海市'},  	{name:'6104',value:'重庆市'},  	{name:'6105',value:'渭南市'},  	{name:'6106',value:'延安市'},  	{name:'6107',value:'汉中市'},  	{name:'6108',value:'榆林市'},  	{name:'6109',value:'安康市'},  	{name:'6110',value:'商洛市'}  	]  }";
  | 
 
- 这里以jquery异步获取的数据类型——json对象和字符串为依据,分别介绍两种方式获取到的结果处理方式。 
 
- var dataObj=eval(“(“+data+”)”);//转换为json对象
 
- 问题:eval函数解析json数据时为什加上圆括号
eval("("+data+")") 
原因在于:eval本身的问题。 由于json是以”{}”的方式来开始以及结束的,在JS中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。
加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将括号内的表达式(expression)转化为对象,而不是作为语句(statement)来执行。举一个例子,例如对象字面量{},如若不加外层的括号,那么eval会将大括号识别为JavaScript代码块的开始和结束标记,那么{}将会被认为是执行了一句空语句。所以下面两个执行结果是不同的:
1 2
   | alert(eval("{}");  alert(eval("({})");
  | 
 
- 对于这种写法,在JS中,可以到处看到。如: (function()) {}(); 做闭包操作时等。
 
1 2 3 4 5 6 7 8
   | alert(dataObj.root.length);  $.each(dataObj.root, fucntion(idx, item) {     if (idx == 0) {         return true;     }          alert("name:" + item.name + ",value:" + item.value); })
   | 
 
注:对于一般的js生成json对象,只需要将$.each()方法替换为for语句即可,其他不变。 
第二种情况
- 对于服务器返回的JSON字符串,如果jquery异步请求将type(一般为这个配置属性)设为“json”,或者利用$.getJSON()方法获得服务器返回,那么就不需要eval()方法了,因为这时候得到的结果已经是json对象了,只需直接调用该对象即可,这里以$.getJSON方法为例说明数据处理方法
 
错误注意
- 使用 result = eval(“ (“+data+”) “);时报如下错误
 
- 错误: 
SyntaxError: missing ] after element list 
- 解决方案:不使用eval转,而直接使用data。
 
- 原因:
 
1 2 3
   | $.ajax( {   type : "post",   dataType : "json", 
  | 
 
jquery调用时会检测到,从而直接把返回格式当做json处理,所以再转化会报错。
后台返回数据的java代码
- 在这里
application/json;charset=UTF-8已经定义了返回的格式当做json处理。 
1 2 3 4 5 6 7 8 9 10 11 12
   | @RequestMapping(value = "/queryCitysById", produces = {"application/json;charset=UTF-8"}) @ResponseBody  public String queryCitysById(HttpServletRequest request, String tagId, String brandCode) {     List < ProductTagCity > tagCities = null;     try {         tagCities = productTagManager.queryCitysById(tagId, brandCode);         logger.info("queryCitysById :tagCities=" + JSONObject.toJSONString(tagCities));     } catch(Exception e) {         e.printStackTrace();     }     return JSONObject.toJSONString(tagCities); }
  | 
 
返回的json数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
   | [{     "brandCode": "MB01",     "businessCityName": "吉林",     "businessCityNo": "M0253",     "createTime": 1471835277000,     "createUser": "admin",     "isValid": 0,     "orgCodeLong": "C-P06-A004-M0253",     "tagCityId": "ff80808156b038080156b03808220000",     "tagId": "2c914eb456b038010156b03801660000",     "updateTime": 1471835277000 }, {     "brandCode": "MB01",     "businessCityName": "四平",     "businessCityNo": "M0274",     "createTime": 1471835277000,     "createUser": "admin",     "isValid": 0,     "orgCodeLong": "C-P06-A004-M0274",     "tagCityId": "ff80808156b038080156b03808220001",     "tagId": "2c914eb456b038010156b03801660000",     "updateTime": 1471835277000 }, {     "brandCode": "MB01",     "businessCityName": "长春",     "businessCityNo": "M0118",     "createTime": 1471835277000,     "createUser": "admin",     "isValid": 0,     "orgCodeLong": "C-P01-A004-M0118",     "tagCityId": "ff80808156b038080156b03808220002",     "tagId": "2c914eb456b038010156b03801660000",     "updateTime": 1471835277000 }]
  | 
 
JavaScript代码
- 这里
var orgs = data;直接使用了,此时的data就是一个会解析成一个 json对象了,不再使用eval,才是正确的写法,不然就会报错 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
   |  function getCityDataFunction(tagId, brandCode) {     var marketPath = $("#marketPath").val();     var params = {};     params['tagId'] = tagId;     params['brandCode'] = brandCode;     $.post(marketPath + "/product_tag/queryCitysById.do", params,     function(data) {         var orgs = data;         if (!orgs || orgs.length == 0) {             $("#tagCityView-text").html("生效的城市列表为空");             return;         }         var orghtml = "";         for (var i = 0; i < orgs.length; i++) {             if (i > 0) orghtml = orghtml + "," + orgs[i].businessCityName;             else orghtml = orghtml + orgs[i].businessCityName;         }         $("#tagCityView-text").html(orghtml);     }); }
 
  | 
 
- 注意:这里使用了
eval("(" + data + ")")就会报错,用法重复了 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
   |  function getCityDataFunction(tagId, brandCode) {     var marketPath = $("#marketPath").val();     var params = {};     params['tagId'] = tagId;     params['brandCode'] = brandCode;     $.post(marketPath + "/product_tag/queryCitysById.do", params,     function(data) {         var orgs = eval("(" + data + ")"); 		         if (!orgs || orgs.length == 0) {             $("#tagCityView-text").html("生效的城市列表为空");             return;         }         var orghtml = "";         for (var i = 0; i < orgs.length; i++) {             if (i > 0) orghtml = orghtml + "," + orgs[i].businessCityName;             else orghtml = orghtml + orgs[i].businessCityName;         }         $("#tagCityView-text").html(orghtml);     }); }
 
  | 
 
资料
      
     
    
   
  
    
    
        
            
				| 个人微信公众号 | 技术交流QQ群 | 
            
            
				
					  | 
					  |