博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】Zend_Json学习
阅读量:4700 次
发布时间:2019-06-09

本文共 2978 字,大约阅读时间需要 9 分钟。

先了解下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函数只能操作字符串,又不可能改封装好的类,我水平不高,之想到了挨个循环数组进行编码转换。下面是我写的适用于三维数组的编码转换,估计三维以上的数组用到的机会也不多吧,呵呵。

$b){ if(is_array($b)){ foreach($b as $c=>$d){ if(is_array($d)){ foreach($d as $e=>$f){ if(is_array($f)){ foreach($f as $i=>$j){ $array[$a][$c][$e][$i] = iconv ($input,$output,$j); } }else{ $array[$a][$c][$e] = iconv($input,$output,$f); } } }else{ $array[$a][$c] = iconv($input,$output,$d); } } }else{ $array[$a] = iconv($input,$output,$b); } } }else{ $array = iconv($input,$output,$array); } return $array;}?>

 

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

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

 

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

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

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

 

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

原文地址:

转载于:https://www.cnblogs.com/hongfei/archive/2012/06/25/2561312.html

你可能感兴趣的文章
centos7下使用yum安装mysql
查看>>
Android View的绘制机制流程深入详解(二)
查看>>
lr 中cookie的解释与用法
查看>>
25匹马的角逐
查看>>
Javascript 中的变量作用域问题
查看>>
MySQL不支持top n的语法
查看>>
62. Unique Paths
查看>>
Error building results for action sayHello in namespace /inteceptor -
查看>>
Hive中分组取前N个值
查看>>
小程序弹窗实例
查看>>
CozyRSS2开发记录0-win10开坑
查看>>
iOS Safari 中click点击事件失效的解决办法
查看>>
公交线路查询接口
查看>>
关于OC中的block自己的一些理解(一)
查看>>
HBase使用场景和成功案例 (转)
查看>>
Flutter 即学即用系列博客——09 MethodChannel 实现原生与 Flutter 通信(二)
查看>>
pom.xml详解
查看>>
Delphi中的dll操作
查看>>
【训练题】分队 P1672
查看>>
博客园界面美化
查看>>