一.为何使用eval(JSON.parse)
目的,将前台或者后台拼接的字符串,转换为JSON对象,这样就可以对应的使用属性的key取出value值,如果是字符串而不是JSON对象,直接取属性会报错
var jsonstr1 = '{"name":"a","company":"b","value":++c}';
var json1 = eval('(' + jsonstr1 + ')');
console.log(json1.value);
如果没有用eval,则value值不能以这种方式取出
二.为何加双引号,可不可以不加
JSON的格式是{key:value},必须在上双引号,才从引号里面的一个整体当成是一个JSON对象去解析,否则报错
三:前后台传输问题(无需使用eval)
有些时候JSON是不需要用的,比如后台已经成功返回的不是字符串而是JSON对象,则不用eval
@RequestMapping(value="saveNode")
public @ResponseBody Map<String, Object> saveNode(@RequestParam(value="parentId", required=true)String parentId, @RequestParam(value="open")String open,@RequestParam(value="url", required=true)String url, @RequestParam(value="target")String target,@RequestParam(value="title", required=true)String title,@RequestParam(value="name",required=true)String name){
TreeDemo demo = new TreeDemo();
demo.setParentId(parentId);
demo.setName(name);
String UUIDString = UUID.randomUUID().toString();
demo.setId(UUIDString);
demo.setUrl(url);
demo.setTitle(title);
if(!StringUtils.isEmpty(open)){
demo.setOpen(open);
}
if(!StringUtils.isEmpty(target)){
demo.setTarget(target);
}
if(!StringUtils.isEmpty(parentId)){
demo.setIsParent("0");
}else{
demo.setIsParent("1");
}
treeDemoService.insertNode(demo);
Map<String,Object> map = Maps.newHashMap();
map.put("id", UUIDString);
return map;
}
已经使用了@ResponseBody包装之后的对象,直接返回的一个map,然后就可以在页面中直接取出id
$.ajax({
url : "${ctx}/treeDemo/saveNode",
type : "POST",
async : false,
data : {parentId : parentId,open : open,url : url,target : target,title : title,name : name},
success:function(e){
//e = eval("(" + e + ")");
id = e.id;
flag = true;
},
errre:function(){
promptAlert(SAVE_FAIL_MSG);
}
});
由此可见@ResponseBody就是转换为JSON对象的形式返回,后台直接取就可以了,因此加上@ResponseBody之后就不需要JSONMapper或者GSON工具等对MAP或者LIST对象直接返回的就是一个JSON对象。
四.需要使用
protected String renderString(HttpServletResponse response, String string, String type) {
try {
response.reset();
response.setContentType(type);
response.setCharacterEncoding("utf-8");
response.getWriter().print(string);
return string;
} catch (IOException e) {
return null;
}
}
这个时候返回的就是通过response直接获取writer然后直接print,返回的就不是一个JSON对象,那么为了取值,就需要转换成JSON对象然后进行取值
$.ajax({
url: "${ctx}/form/saveCategory.do",
type:"post",
async:false,
data: {categoryName:categoryName,parentId:parentId,parentCode:parentCode,categoryDesc:categoryDesc,customCode:customCode},
success: function(result){
result = eval("("+result+")");
id = result.id;
code = result.code;
success = true;
},
error:function(){
promptAlert(SAVE_FAIL_MSG);
}
});