处理JSON数据

目录

这一段时间,学习网页制作时,也尝试Google和新浪等网站的API,两者都是REST(

Representational State Transfer)的软件架构,通过HTTP传递指令参数并获取数据。数据一般有两种格式,XML和JSON。XML文件较大,就试了下JSON这种短小精悍的数据结构。
JSON代表JavaScript 对象表示法(JavaScript Object Notation)。参看w3cschool的教程
一个典型的JSON结构如下所示(来自维基百科

{
     "firstName": "John",
     "lastName": "Smith",
     "male": true,
     "age": 25,
     "address":
     {
         "streetAddress": "21 2nd Street",
         "city": "New York",
         "state": "NY",
         "postalCode": "10021"
     },
     "phoneNumber":
     [
         {
           "type": "home",
           "number": "212 555-1234"
         },
         {
           "type": "fax",
           "number": "646 555-4567"
         }
     ]
 }

{ } 代表一个对象。
name:value 表示一个数据项,可以为数字(例如0)、字符串(用双引号包含,如“风中飞舞”)、布尔值(true 或者 false)。不同数据项用逗号分隔。
[ ] 表示数组。

处理JSON数据

JavaScript

JavaScript中可以直接使用JSON对象。例如在firebug控制台中:

obj = { “name”:”myobj”,”type”:”json”}
Object { name=“myobj”, type=“json”}
JSON最常用的使用方法是将JSON文本(字符串)解析成JavaScript对象。JavaScript的eval函数实现这样的功能。

>>> objstring = ‘{\ “name\”:\”myobj\”,\”type\”:\”json\”}’
“{ “name”:”myobj”,”type”:”json”}”
>>> eval(‘(‘+objstring+’)’)
eval函数不够安全,可以执行任意js代码。现代浏览器都自带JSON解释器。用JSON.parse()解析字符串。
JSON.stringify()将JSON对象编码成字符串。
>>> JSON.stringify(obj)
“{“name”:”myobj”,”type”:”json”}”

jQuery库

jQuery.parseJSON() 函数可以将JSON字符串解析成JavaScript对象。

>>> $.parseJSON(objstring)
Object { name=“myobj”, type=“json”

jQuery还可以通过Ajax技术,使用 jQuery.getJSON() 获取JSON文件。该函数还可以通过JSONP技术,设置callback函数,解决Ajax限制跨域传输的问题,实现跨域抓取JSON文件。
很多函数需要数组型参数,但parseJSON方法得到的是对象,需要将javascript对象转换成javascript数组。jQuery.makeArray()函数可以将数组形式的对象转换成数组(数组形势的对象应该是指没有成员方法的对象)。

>>> data
“{“status”:”OK”,”result”:[[[“string”,”\u5e74\u4efd”],[“number”,”\u5fae\u535a\u6570″]],[[“2010\u5e74”,1],[“2011\u5e74”,2],[“2012\u5e74″,3]]]}”
>>> data_obj = $.parseJSON(data);
>>> data_array = $.makeArray(data_obj.result);
[[[“string”, “年份”], [“number”, “微博数”]], [[“2010年”, 1], [“2011年”, 2], [“2012年”, 3]]]

 

PHP

PHP可以实现数组或对象与JSON格式数据字符串之间的转换。
json_encode()
将数组或对象编码成JSON字符串。
json_decode()
将JSON字符串解析成数组或对象。
用var_dump()输出的数组显示如下

array(2) {
  ["shorturl"]=>
  string(17) "//dwz.cn/yes"
  ["longurl"]=>
  string(20) "//www.baidu.com"
}

编码后,得到

{"shorturl":"http:\/\/dwz.cn\/yes","longurl":"http:\/\/www.baidu.com"}

反之亦然。