JSON 和 JavaScript eval

 

  JSON (JavaScript Object Notation) 一种轻量级的数据交换格式,比 XML 更轻巧,JSON 是JavaScript 原生格式,这意味着 JavaScript 中处理 JSON 数据不需要任何 API 和工具包。

  JSON 格式可以使对象(object)、数组(array)、值(value)、字符串(string)、数值(number)。

  

 

代码
 1 <script type="text/javascript">
 2     var user = {
 3         "Name":"Andy",
 4         "Sex" :"man",
 5         "Age" :"20",
 6         "Phone":{"mobilephone":"123456789","telephone":"1234-12345678"},
 7         "baby":[{"big":"xiaohong"},{"middle":"xiaoming"},{"small":"xiaoli"}] //包含数组
 8     }
 9     alert(user.Name);
10     alert(user.Phone.mobilephone);
11     alert(user.baby[0].big);
12     user.baby[0].big = "--";//修改了 JSON 值
13     alert(user.baby[0].big);
14 </script>
 

参考:http://www.json.org/json-zh.html

 

 

 

  下面来看看 JavaScript 的 eval  函数。

  eval 函数会评估给定的一个JavaScript代码的字符串,并试图去执行包含在字符串里的表达式或者一系列的合法的 JavaScript 语句。eval 函数将把最后一个表达式或者语句包含的值或引用作为返回值。

 

代码
<script type="text/javascript">
    
var bar = "bar";
    
var foobar = eval('"foo"+bar');
    alert(bar 
+ foobar);//执行语句

    foobar 
= eval('if(bar = "bar"){bar = "foo-bar";}else{bar = "bar-foo";}');
    alert(foobar);
//返回语句中包含的值
</script>

 

  JSON 和 对象字面量(Object Literals)的区别:JSON 的名字部分严格用引号+名字来表示。

 代码

<script type="text/javascript">
    
//对象字面量
    var objectLiteral = {
        name:
"Objector.L",
        age:
"24",
        special:
"JavaScript",
        sayName:
function(){
            
return this.name;
        }
        };

    
//JSON 对象
    var jsonFormat = {
        
"summary":"Blogs",
        
"blogrolls":[
            {
            
"title":"Explore JavaScript",
            
"link":"http://example.com"
            },
            {
            
"title":"Explore JavaScript",
            
"link":"http://example.com"
            }
        ]
    };
</script>

 

  由于 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解释成代码块。

   

 

    //eval 错误解析语义
    alert(eval('{foo:"bar"}'));    //return "bar",incorrect
    //eval 正确解析JSON
    alert(eval('({"foo":"bar"})'));//return JSON object,correct

 

 

 

 

 

 

 参考:http://www.jb51.net/article/21688.htm

posted @ 2010-06-11 22:56  安迪.  阅读(633)  评论(0编辑  收藏  举报