eval解析JSON字符串的一个小问题 喜欢ヅ旅行 2022-10-19 01:23 154阅读 0赞 ![62cf89197c281ca4a830f62a60182bf0.png][] > 作者:韩子迟 > > 网址:http://www.cnblogs.com/zichi/p/5202825.html 之前写过一篇 [关于 JSON][JSON] 的介绍文章,里面谈到了 JSON 的解析。我们都知道,高级浏览器可以用 JSON.parse() API 将一个 JSON 字符串解析成 JSON 数据,稍微欠妥点的做法,我们可以用 eval() 函数。 > var str = '\{"name": "hanzichi", "age": 10\}'; > > var obj = eval('(' + str + ')'); > > console.log(obj); // Object \{name: "hanzichi", age: 10\} 是否注意到,向 eval() 传参时,str 变量外裹了一层小括号?为什么要这样做? 我们先来看看 eval 函数的定义以及使用。 eval() 的参数是一个字符串。如果字符串表示了一个表达式,eval() 会对表达式求值。如果参数表示了一个或多个 JavaScript 声明, 那么 eval() 会执行声明。不要调用 eval() 来为算数表达式求值;JavaScript 会自动为算数表达式求值。 简单地说,eval 函数的参数是一个字符串,如果把字符串 “noString” 化处理,那么得到的将是正常的可以运行的 JavaScript 语句。 怎么说?举个栗子,如下代码: > var str = "alert('hello world')"; > > eval(str); 执行后弹出 “hello world”。我们把 str 变量 “noString” 化,粗暴点的做法就是去掉外面的引号,内部调整(转义等),然后就变成了: > alert('hello world') very good!这是正常的可以运行的 JavaScript 语句!运行之! 再回到开始的问题,为什么 JSON 字符串要裹上小括号。如果不加,是这个样子的: > var str = '\{"name": "hanzichi", "age": 10\}'; > > var obj = eval(str); // Uncaught SyntaxError: Unexpected token : 恩,报错了。为什么会报错?试试把 str “noString” 化,执行一下: > \{"name": "hanzichi", "age": 10\}; // Uncaught SyntaxError: Unexpected token : 毫无疑问,一个 JSON 对象或者说是一个对象根本就不是能执行的 JavaScript 语句!等等,试试以下代码: > var str = '\{name: "hanzichi"\}'; > > var obj = eval(str); > > console.log(obj); // hanzichi 这又是什么鬼?但是给 name 加上 “” 又报错? > var str = '\{"name": "hanzichi"\}'; > > var obj = eval(str); // Uncaught SyntaxError: Unexpected token : > > console.log(obj); 好吧,快晕了,其实还是可以将 str “nostring” 化,看看是不是能正确执行的 JavaScript 语句。前者的结果是: > \{name: "hanzichi"\} 这确实是一条合法的 JavaScript 语句。\{\} 我们不仅能在 if、for 语句等场景使用,甚至可以在任何时候,因为 ES6 之前 JavaScript 只有块级作用域,所以对于作用域什么的并不会有什么冲突。去掉 \{\} 后 name: "hanzichi"也是合法的语句,一个 label 语句,label 语句在跳出嵌套的循环中非常好用,具体可以参考 label,而作为 label 语句的标记,name 是不能带引号的,标记能放在 JavaScript 代码的任何位置,用不到也没关系。 一旦一个对象有了两个 key,比如 \{name: "hanzichi", age: 10\} ,ok,两个 label 语句?将 “hanzhichi” 以及 10 分别看做是语句,但是 语句之间只能用封号连接!(表达式之间才能用逗号)。所以改成下面这样也是没有问题的: > var str = '\{name: "hanzichi"; age: 10\}'; > > var obj = eval(str); > > console.log(obj); // 10 越扯越远,文章开头代码的错误的原因是找到了,为什么套个括号就能解决呢?简单来说,() 会把语句转换成表达式,称为语句表达式。括号里的代码都会被转换为表达式求值并且返回,对象字面量必须作为表达式而存在。 本文并不会大谈表达式,关于表达式,可以参考文末链接。值得记住的一点是,表达式永远有一个返回值。大部分表达式会包裹在() 内,小括号内不能为空,如果有多个表达式,用逗号隔开,也就是所谓的逗号表达式,会返回最后一个的值。 说到表达式,不得不提函数表达式,以前翻译过一篇关于立即执行函数表达式的文章,可以参考下,文末。 Read More: * \[译\]JavaScript中:表达式和语句的区别 * (译)详解javascript立即执行函数表达式(IIFE) * 深入探究javascript的 \{\} 语句块 ![2f32613032364516114950b6e64348a9.png][] [62cf89197c281ca4a830f62a60182bf0.png]: /images/20221005/b8fead5d78e9408bb19de1132c71cd5a.png [JSON]: http://mp.weixin.qq.com/s?__biz=MzAxODE2MjM1MA%3D%3D&idx=1&mid=204907855&scene=21&sn=f9b581131ac78df71daee63763fc89de#wechat_redirect [2f32613032364516114950b6e64348a9.png]: /images/20221005/5c15b23fa5c24a648727dd08a5d3ba45.png
相关 Java JSON解析问题:非JSON字符串转JSON失败 在Java中,如果你有一个非JSON的字符串,直接使用`org.json.JSONObject`或者其他JSON库进行解析通常会失败。这是因为非JSON字符串不符合JSON数据 谁借莪1个温暖的怀抱¢/ 2024年09月11日 20:30/ 0 赞/ 56 阅读
相关 php 解析json字符串 在PHP中解析JSON字符串通常使用内置的json\_decode函数。json\_decode函数将一个JSON格式的字符串转换为PHP对象(如果设置第二个参数为true,则 r囧r小猫/ 2024年02月22日 01:59/ 0 赞/ 72 阅读
相关 MySQL解析json字符串的相关问题 很多时候,我们需要在sql里面直接解析json字符串。这里针对mysql5.7版本的分水岭进行区分。 查看MySQL版本: SELECT VERSION(); 对 蔚落/ 2022年10月31日 04:21/ 0 赞/ 175 阅读
相关 eval解析JSON字符串的一个小问题 ![62cf89197c281ca4a830f62a60182bf0.png][] > 作者:韩子迟 > > 网址:http://www.cnblogs.com/zich 喜欢ヅ旅行/ 2022年10月19日 01:23/ 0 赞/ 155 阅读
相关 解析json字符串 String resp=“需要解析的字符串json”; JSONObject jo = JSON.parseObject(resp); List: JSONArray - 日理万妓/ 2022年10月07日 00:46/ 0 赞/ 197 阅读
相关 JavaScript解析json字符串 在JavaWeb的开发过程中对json字符串的解析是比较常见的,那么怎么借助JavaScript去解析json字符串呢?这里直接上代码: 代码 今天药忘吃喽~/ 2022年08月20日 14:08/ 0 赞/ 163 阅读
相关 解析 json 字符串 // 解析 json String json = "\{'status':200,'message':'查询成功','data': Dear 丶/ 2022年05月22日 03:07/ 0 赞/ 284 阅读
相关 怎样用java解析一个json字符串 \{“data”:\{"a":\[\{"b1":"bb1","c1":"cc1"\},\{"b2":"bb2","c2":"cc2"\}\]\}\} 怎样在后台提取出 悠悠/ 2022年05月19日 05:39/ 0 赞/ 137 阅读
相关 gson解析json字符串 String retJson = HttpRequestUtil.sendGet1(url, auth, null); JsonParser parser = r囧r小猫/ 2022年05月09日 18:12/ 0 赞/ 335 阅读
还没有评论,来说两句吧...