在JavaScript中使用JSON数据
JSON是JavaScript原生格式,这意味着在JavaScript中处理JSON数据不需要任何特殊的API或工具包。
JSON语法
JSON建构于两种结构:
对象——名称/值对的集合。不同的语言中,它被理解为对象,纪录,结构,字典,哈希表,有键列表(keyedlist),或者关联数组。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值'对”之间使用“,”(逗号)分隔。
数组——值的有序列表。在大部分语言中,它被理解为数组。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
JSON没有变量或其他控制结构。JSON只用于数据传输。
将JSON数据赋值给变量
例如,可以创建一个新的JavaScript变量,然后将JSON格式的数据字符串直接赋值给它:
varpeople= {"programmers":[ {"firstName":"Brett","lastName":"McLaughlin","email":"brett@newInstance.com"}, {"firstName":"Jason","lastName":"Hunter","email":"jason@servlets.com"}, {"firstName":"Elliotte","lastName":"Harold","email":"elharo@macfaq.com"} ], "authors":[ {"firstName":"Isaac","lastName":"Asimov","genre":"sciencefiction"}, {"firstName":"Tad","lastName":"Williams","genre":"fantasy"}, {"firstName":"Frank","lastName":"Peretti","genre":"christianfiction"} ], "musicians":[ {"firstName":"Eric","lastName":"Clapton","instrument":"guitar"}, {"firstName":"Sergei","lastName":"Rachmaninoff","instrument":"piano"} ] }
这非常简单;现在people包含前面看到的JSON格式的数据。但是,这还不够,因为访问数据的方式似乎还不明显。
访问数据
尽管看起来不明显,但是上面的长字符串实际上只是一个数组;将这个数组放进JavaScript变量之后,就可以很轻松地访问它。实际上,只需用点号表示法来表示数组元素。所以,要想访问programmers列表的第一个条目的姓氏,只需在JavaScript中使用下面这样的代码:
people.programmers[0].lastName;
注意,数组索引是从零开始的。所以,这行代码首先访问people变量中的数据;然后移动到称为programmers的条目,再移动到第一个记录([0]);最后,访问lastName键的值。结果是字符串值“McLaughlin”。
下面是使用同一变量的几个示例。
people.authors[1].genre //Valueis"fantasy" people.musicians[3].lastName //Undefined.Thisreferstothefourthentry,andthereisn'tone people.programmers[2].firstName //Valueis"Elliotte"
利用这样的语法,可以处理任何JSON格式的数据,而不需要使用任何额外的JavaScript工具包或API。
修改JSON数据
正如可以用点号和括号访问数据,也可以按照同样的方式轻松地修改数据:
people.musicians[1].lastName="Rachmaninov";
在将字符串转换为JavaScriptjson格式对象之后,就可以像这样修改变量中的数据。
注意:json格式的对象和json文本是不同的
varobj={name:"张三","sex":'男'};//json格式的对象 varstr="{name:"张三","sex":'男'}";//json格式的字符串(json格式的文本)
转换回字符串
当然,如果不能轻松地将对象转换回本文提到的文本格式,那么所有数据修改都没有太大的价值。在JavaScript中这种转换也很简单:
varnewJSONtext=people.toJSONString();
这样就行了!现在就获得了一个可以在任何地方使用的文本字符串,例如,可以将它用作Ajax应用程序中的请求字符串。
更重要的是,可以将任何JavaScript对象转换为JSON文本。并非只能处理原来用JSON字符串赋值的变量。为了对名为myObject的对象进行转换,只需执行相同形式的命令:
<scripttype="text/javascript"> functionCar(make,model,year,color) { this.make=make; this.model=model; this.year=year; this.color=color; } functionshowCar() { varcarr=newCar("Dodge","CoronetR/T",1968,"yellow"); alert(carr.toJSONString()); } </script>
这就是JSON与其他数据格式之间最大的差异。如果使用JSON,只需调用一个简单的函数,就可以获得经过格式化的数据,可以直接使用了。对于其他数据格式,需要在原始数据和格式化数据之间进行转换。即使使用DocumentObjectModel这样的API(提供了将自己的数据结构转换为文本的函数),也需要学习这个API并使用API的对象,而不是使用原生的JavaScript对象和语法。
最终结论是,如果要处理大量JavaScript对象,那么JSON几乎肯定是一个好选择,这样就可以轻松地将数据转换为可以在请求中发送给服务器端程序的格式(Ajax)。
JSON字符串转换为JSON对象的方法
要使用上面的str1,必须使用下面的方法先转化为JSON对象:
//由JSON字符串转换为JSON对象 varobj=eval('('+str+')');
或者
varobj=str.parseJSON();//由JSON字符串转换为JSON对象
或者
varobj=JSON.parse(str);//由JSON字符串转换为JSON对象
然后,就可以这样读取:
Alert(obj.name); Alert(obj.sex);
特别注意:如果obj本来就是一个JSON对象,那么使用eval()函数转换后(哪怕是多次转换)还是JSON对象,但是使用parseJSON()函数处理后会有问题(抛出语法异常)。