php中json编码和解码的一些提示

对于php下的web service应用,json因其快速,轻量在小数据量传输的时候非常有优势,但用的时候有些小细节需要注意。我就是把数组存进去,再取出来的时候发现变成对象了,才发现原来是这样。
在运行环境上,json在php5.2以上才是内置的。
常用的方法是json_encode和json_decode。
json_encode的参数只有一个,就是要被转换的数据,而json_decode就不一样,他可以把json格式转换成对象(object)和数组两种
下面是个例子
$arr = array(”1″,”2″,”3″);
print_r($arr);
echo json_encode($arr);
print_r(json_decode(json_encode($arr)));
print_r(json_decode(json_encode($arr), true));
如果数组转成json,想解码回来的,别忘了加个参数true


ecshop下can’t parse to JSON出错的一种解决思路

ecshop是一个php下非常常用的开源商城系统,他的ajax的功能非常强大,几乎所有的操作都涉及到了异步操作。
正因为如此,他的模版制作门槛就有点高,你会时不时地发现,这个不显示了,那个不能操作了。除非你用默认模版,不然有你搞得。
根据我的经验,很多情况,如果我们发现功能不能用,该有反应的地方突然没有反应了,我们应该先检查你的模板文件里是不是包含了以下这段代码

var process_request = “正在处理您的请求…”;

这几乎是最常见的AJAX错误,也是发生最多的。
不过这次我做要提到的解决思路要复杂很多。这个错误不常发生,却很难找到解决办法。
当我们点击购买按钮时候,这个商品应该是自动进入购物车,但动作没有响应。如果你在ie下,会出现JS报错。
Exception thrown and not caught (抛出的异常没有被接住)
如果我们用工具调试,会发现类似这样的报错
Fatal error: Bad string at offset 2: {\”spec\”:[],\”goods_id\”:4154,\”number\”:1,\”parent\”:0}
联动文章:http://bbs.ecshop.com/thread-109570-1-1.html (他遇到的问题很我类似)
我先说解决办法:从报错,我们可以看到错误出在了第二反斜杠上。默认情况下,PHP 指令 magic_quotes_gpc 为 on,对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。而ECSHOP没有对POST的数据进行过滤。
简单的解决办法: 在FLOW.php文件的57行,像我这样加上过滤
$_POST['goods'] = stripslashes(json_str_iconv($_POST['goods']));
我中间我一度认为是ecshop的transport和jquery冲突,因为我把ECSHOP做为一个插件插到了PHPCMS2008中。唉,走了很多弯路,做了很多调试才发现这个小Bug的,希望大家不要走我的老路。
联动讨论:http://bbs.ecshop.com/thread-76312-1-1.html


简析基于JavaScript的轻量级数据交换格式-JSON

JSON简介
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。
JSON结构
1. “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
2. 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。
JSON具体形式
1、对象是一个无序的“‘名称/值’对”集合。一个对象以“{”开始,以“}”结束。每个“名称”后跟一个“:”,“‘名称/值’对”之间使用“,”分隔。例:{name:value}
2、数组是值(value)的有序集合。一个数组以“[”开始,“]”结束。值之间使用“,”分隔。例: [collection, collection]
3、值(value)可以是双引号括起来的字符串(String)、数值(number)、true、false、null、对象(object)或者数组(array)。这些结构可以嵌套。
4、字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜体转义。一个字符(character)即一个单独的字符串(characeter string).
JSON与XML
1 JSON和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,很难分出胜负。
2 XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。
3 XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。
4 XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。这一点XML输的真是没话说。
XML和JSON都使用结构化方法来标记数据,下面来做一个简单的比较。
现假设有一个用户数据包括:用户名、密码、所在部门、性别、年龄。
用XML表示如下:
<?xml version=”1.0″ encoding=”utf-8″?>
<user>
<name>张三 </name>
<password>123456</password>
<department>技术部</department>
<sex>男</sex>
<old>30</old>
</user>
用JSON表示如下:
{
“name”:”张三”,
“password”:”123456″,
“department”:”技术部”,
“sex”:”男”,
“old”:”28″
}
与XML一样,JSON也是基于文本的,且它们都使用Unicode编码,同样具有可读性。XML比较适合于标记文档,而JSON却更适合于时行数据交换处理。
JavaScript的eval()
?
由于JSON在语法上是JavaScript的子集和,所以其一般用eval()作为读取资料的方式,致使存在跨站的安全问题。
一种防止不安全代码的解决办法是透过parseJSON()读取JSON资料,parseJSON采用解析器验证读入的代码是否是JSON代码,但这样会在速度上比eval()慢。同样道理,跨站存取也存在于JSON,由于Javascript采用了称为“沙盒”的机制,这种机制限制Javascript引擎仅能引入同一个站点的代码,因而某种程度上提高了安全性。