2007-02-04

AJAJ, PHP JSON Javascript

AJAX(Asynchronous JavaScript and XML)是最近很熱門的技術,除了使用XML當作溝通的格式之外,現在又跑出了一個JSON可以應用在AJAX上,等等...應該正名叫做AJAJ(Asynchronous JavaScript and JSON)了!!


JSON
JSON全名叫做JavaScript Object Notation ,是一種描述javascript裡物件還有陣列(js的陣列其實也是物件啦)的一種簡略表示方法,他本來就是js標準裡的東西。
像是下面這個

//Javascript
var test={
 "x":1,
 "y":2,
 "str":"test string"
};


上面被{ }包起來的就是物件,就是建立一個叫做test的物件,裡面的格式大概就是 "屬性的名字":屬性的值,如果屬性的值是字串要用""包起來,屬性間以逗號(,)分開,test.x的值會是1,test.str是"test string"

//Javascript
var test_array=[
  "array value 1",
  "array value 2",
  3
 ];


而這個被[ ]包起來的是陣列,像test_array[0]的值就是"array value 1"。
當然{}還有[]是可以互包的,像下面這樣

//Javascript
var test={
 "x":1,
 "y":2,
 "str":"test string",
 "a":[
  "array value 1",
  "array value 2",
  3
 ],
 obj_array:[
  {
   xx:0,
   xxx:2
  },
  {
   xx:3,
   xxx:5
  }
 ]
};

上面這個例子 test.a[2]會是3,test.obj_array[1].xxx會是5

JSON並不是什麼新技術,就算我這個javascript菜鳥根本連聽都沒聽過,至少也在一些js程式有看過,但似乎從PHP5.2內建JSON轉換函數的消息一出來,就越來越常看到這個名詞,對於最近初接觸AJAX的在下,真的覺得XML在處理上頗囉唆,所以當在下知道JSON是什麼之後真的很興奮,終於可以把XML給丟了 = =

PHP & JSON
PHP在5.2之後內建有json_encode還有json_decode可以直接轉換php的物件、陣列成為JSON,那如果版本不是5.2之後又沒有系統權限的要怎麼辦?放心早就有用PHP寫了JSON的轉換程式,像是PEAR的Services_JSON,Zend Framework裡面也有Zend_Json可以用。

//PHP
$test=array(
 "x" => 1,
 "y" => 2,
 "str" => "test string",
 "a" => array (
  "array value 1",
  "array value 2",
  3
 }
);


上面這是PHP中的陣列 $test['x']會是1,$test['a'][0]是字串"array value 1"

我們使用


//PHP
$jsonstr = json_encode($test);
$jsonstr 的內容就會變成像下面這樣
{
 "x":1,
 "y":2,
 "str":"test string",
 "a":[
  "array value 1",
  "array value 2",
  3
 ]
}

AJAJ
當我們在javascript用XMLHttpRequest 取回json的字串jsonstr之後
只要

//Javascript  
var test= eval("("+ jsonstr + ")"); //那個()是一定要加的

這樣test=x就是1,$test.a[0]是字串"array value 1"

可以注意到在PHP中可以使用字串作為陣列的索引值,但是js中只能用數字,所以原本在PHP中陣列索引是字串的,透過JSON轉換到js裡都會變成物件的屬性,當然原本PHP中就是用數字當索引陣列的轉在JS裡還是陣列。


在下測試到現在基本上還沒遇到什麼問題,不過目前json_encode對中文字只能用utf8,如果用big5轉出來有中文的值會變成空白。

沒有留言: