智能提示jquery-ui 插件返回json串时使用,顺道了解了下eval函数
一、JSON:Javascript对象表示法(Javascript Object Notation)
JSON是存储和交换文本信息的语法。类似XML
json语法规则
json语法是Javascript对象表示语法的子集
1、数据在名称/值对中
2、数据由逗号分隔
3、花括号保存对象
4、方括号保存数组
JSON名称/值对
书写格式:名称/值对
名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值:
"firstName":"John" 等价于 firstName="John"
对象可以包含多个名称/值对
{ "firstName":"John" , "lastName":"Doe" }等价于
firstName="John";
lastName="Doe";
JSON数组
json数组在方括号中书写:
数组可包含多个对象:
{"emplorees":[
{"firstName":"John","lastName":"Doe"},
{"firstName":"Anna","lastName":"Smith"},
{"firstName":"Peter","lastName":"Jones"}
]
}
把 json 文本转换为javascript对象
json最常见的用法之一,是从web服务器上读取JSON数据(作为文件或
者做HttpRequest),讲json数据转换为javascript对象,然后在网页
中使用该数据。
JSON实例-来自字符串的对象
创建包含JSON语法的Javascript字符串
var txt = '{ "employees" : [' +'{ "firstName":"Bill" ,
"lastName":"Gates" },' +'{ "firstName":"George" ,
"lastName":"Bush" },' +'{ "firstName":"Thomas" ,
"lastName":"Carter" } ]}';
由于JSON语法是Javascript语法的子集,Javascript函数eval()
可用于讲Json文本转换为Javascript对象;
eval()函数使用的是Javascript编译器,可解析json文本。然后生成
Javascript对象。必须把文本包围在括号中,这样才能避免语法错误
var obj=eval("("+txt+")");
eval函数的工作原理
eval函数会评估一个给定的含有JavaScript代码的字符串,并且试图去执行包含在字符串里的表达式或者一系列的合法的JavaScript语句。eval函数将把最后一个表达式或者语句所包含的值或引用作为返回值。
举例说明
var bar = 'bar'; var foobar = eval('"foo" + bar'); alert(foobar);
var bar = 'bar'; // if variable bar equals 'bar', foobar is the result of // last executing statement: bar="foo-bar"; var foobar = eval('if(bar == "bar") {bar="foo-bar";} else {bar = "bar-foo";}'); alert(foobar);// change the valuebar = 'foo'; // now our the last executed statement is: bar = "bar-foo"; // therefore the value of variable foobar has been changed // into 'bar-foo' foobar = eval('if(bar == "bar") {bar="foo-bar";} else {bar = "bar-foo";}'); alert(foobar);
JSON的格式
JSON的格式是由大括号和由冒号(:)构成的名值对所组成的。注意JSON格式与对象字面量 (object literals) 的区别:JSON的名字部分严格用引号+名字来表示。
举例说明
var objectLiteral = { name: "Objector.L", age: "24", special: "JavaScript", sayName: function() { return this.name; } };
var jsonFormat = { "summary": "Blogs", "blogrolls": [ { "title": "Explore JavaScript", "link": "http://example.com/" }, { "title": "Explore JavaScript", "link": "http://example.com/" } ] };
eval和JSON
由于Ajax的兴起,JSON这种轻量级的数据格式作为客户端与服务器之间的传输格式逐渐地流行起来,进而出现的问题是如何将服务器端构建好的JSON数据转化为可用的JavaScript对象。利用eval函数无疑是一种简单而直接的方法。在转化的时候需要将JSON字符串的外面包装一层圆括号:
var jsonObject = eval("(" + jsonFormat + ")");
为什么要加括号?
加上圆括号的目的是迫使eval函数在评估JavaScript代码的时候强制将括号内的表达式(expression)转化为对象,而不是作为语句(statement)来执行。举一个例子,例如对象字面量{},如若不加外层的括号,那么eval会将大括号识别为JavaScript代码块的开始和结束标记,那么{}将会被认为是执行了一句空语句。所以下面两个执行结果是不同的:
alert(eval("{}"); // return undefined alert(eval("({})");// return object[Object]
JSON格式的名字部分为什么要加引号?
因为eval函数会将{foo:”bar”}解释成合法的JavaScript语句,而非表达式。但是人们往往想要的是让eval将这段代码解释成一个对象。所以JSON格式会强制你去在名字的外侧加上引号再结合圆括号,这样eval就不会错误的将JSON解释成代码块。
举例说明
alert(eval('{foo:"bar"}')); // return "bar", incorrect
alert(eval('({"foo": "bar"})')); // return JSON object, correct
结论
理解eval的工作原理和json的严格的限定格式,合理结合eval和json应用于JavaScript的数据传递和对象转换。
following this format:
eval('{' + jsonString + ')');