虾米窝窝 -- » Zend学习杂谈–Zend_Json数据
Subscribe RSS
Zend学习杂谈–Zend_Json数据 08月 30

先了解下Json(资料来自www.json.org):JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language(http://www.crockford.com/javascript), Standard ECMA-262 3rd Edition – December 1999(http://www.ecma-international.org/publications/files/ecma-st/ECMA-262.pdf)的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。

JSON建构于两种结构:“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。

以前在用Ajax的时候传输数据最多用的是text(html),偶尔也用用XML。但是在PHP文件中生成HTML是一件非常麻烦的事情,更不要说在HTML中添加各种效果了;用XML呢,虽然说这是当下比较流行的数据存储和传输格式,但是我们在后台也要生成一遍XML,在前台用DOM解析起来也非常之慢。听说又种叫Json的传输格式有愈加流行的趋势,它是JavaScript中内置的,无需解析,用起来速度非常快。而在最近学习的Zend Framework中有它的相关操作方法,我就决定试试来用它了。

在Zend Framework提供了Zend_Json::decode和Zend_Json::encode两个两个公共的static方法来操作Json数据。

Zend_Json::decode可以将获取到的Json数据转化为你所希望的数据类型,默认是数组,但是如果你希望它返回一个对象,可以用Zend_Json::decode($encodedValue, Zend_Json::TYPE_OBJECT)。

利用Zend_Json::encode可以轻松的将PHP中的Json字符串,类,数组等数据转化成JavaScript中能直接读取操作的Json数据,但要注意的是在Ajax和Json的传输过程中使用的是UTF-8编码,所有使用其它编码的数据必须转化成这个编码,否则在使用Zend_Json::encode时会出现汉字乱码或者是汉字字符串丢失的情况。由于我的项目用的是GB2312,封装的类返回的数据也全是GB2312编码的多维数组,而PHP的iconv函数只能操作字符串,又不可能改封装好的类,我水平不高,之想到了挨个循环数组进行编码转换。下面是我写的适用于三维数组的编码转换,估计三维以上的数组用到的机会也不多吧,呵呵。

  1. function arrayCoding($array,$input,$output){
  2. if(is_array($array)){
  3. foreach($array as $a=>$b){
  4. if(is_array($b)){
  5. foreach($b as $c=>$d){
  6. if(is_array($d)){
  7. foreach($d as $e=>$f){
  8. if(is_array($f)){
  9. foreach($f as $i=>$j){
  10. $array[$a][$c][$e][$i] = iconv
  11.  
  12. ($input,$output,$j);
  13. }
  14. }else{
  15. $array[$a][$c][$e] = iconv($input,$output,$f);
  16. }
  17. }
  18. }else{
  19. $array[$a][$c] = iconv($input,$output,$d);
  20. }
  21. }
  22. }else{
  23. $array[$a] = iconv($input,$output,$b);
  24. }
  25. }
  26. }else{
  27. $array = iconv($input,$output,$array);
  28. }
  29. return $array;
  30. }

另外一个问题是我在用Zend_Json::decode的时候转换出的Json中是用双引号把数据括起来的,单是Js中只能用单引号括,不知道这是我操作不当还是它本身的问题,没办法我只能这样:

PHP代码
  1. $json = str_replace("\"","’",$json);

 

呵呵,没有想到的是str_replace居然对数组也起左右,我还以为只对字符串起作用呢。

至于Js那边读取就很简单了,例如我Ajax的CallBack的数据是:

JavaScript代码
  1. var json=[{'fl_id':'1896','fl_subject':'\u7a0e\u52a1\u8db3\u7403\u961f',
  2. 'taglist':[{'tg_id':'2169','tg_name':'\u7a0e\u52a1\u8db3\u7403\u961f'}],
  3. ‘creater’:’solo’,‘flvd’:’s\/solo\/1896′}{‘fl_id’:‘1897′,
  4. ‘fl_subject’:‘\u7a0e\u52a1\u8db3\u7403\u961f’,
  5. ‘taglist’:[{'tg_id':'2169','tg_name':'\u7a0e\u52a1\u8db3\u7403\u961f'}],
  6. ‘creater’:’solo’,’flvd’:’s\/solo\/1896′}]

 

如果我要取fl_subject’:'\u7a0e\u52a1\u8db3\u7403\u961f’,这一项里的值只需要用json[0].fl_subject就行了。

Category: PHP&MySQL  | 标签: , , , , , , , ,  | 1656次阅读
你可以通过RSS 2.0来关注此文章的评论. 也可以留言或者从你的主页trackback.
留言

XHTML: 你可以使用以下的标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>