在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群 |
|
|