JSON讨论

来源:互联网 发布:云点播源码 编辑:程序博客网 时间:2024/05/21 19:37


最近看到gmail和sohu的blog都在使用json传输数据,感觉比直接传输文本和xml效率会高一些,大家一起讨论~~~
json给我感觉有点象php中的序列化和反序列化,把数组等数据格式转化为一个特定的字符串,可以节省空间或者带宽,需要时在恢复回来。


附:
JSON-PHP类库下载及手册

JSON一种轻量级的数据格式,由一位资深的软件工程师Douglas Crockford开发,全称为Javascript Object Notation。中文翻译为“JavaScript对象表示”,这个格式的数据可以很容易的被转换为javascript对象的格式,用于服务器端和客户端的数据传递,用于解决xml的过多冗余标签造成数据传输量过大的问题。

JSON-PHP是一个自动完成JSON编码和解码的php开源代码工具。

下载:http://www.eb163.com/code/json.rar

其中的TEST_JSON.php中包含了PHPUnit.php,是PEAR自带的单元测试工具,实际开发中可以不用。

示例代码:

//create a new instance of Services_JSON
require_once('JSON.php');
$json = new Services_JSON();

// convert a complex value to JSON notation
$value = array(1, 2, 'foo');
$output = $json->encode($value);
print($output);

// accept incoming POST data
$input = $GLOBALS['HTTP_RAW_POST_DATA'];
$value = $json->decode($input);  

 

相关评论
作者: 猪 发布日期: 2006-8-19
是个好东东,偶也在看
作者: ccxxcc 发布日期: 2006-8-21
昨天测试了下 似乎不支持gb2312,用gb232的页面就会JSON.php报错 也许要转码才行,有空再试试
下面的代码需要utf-8文件,不然会出错

 

<?php
require_once 'JSON.php';
$json = new Services_JSON();

$value = array(
array("title"=>"学习php","content"=>"一切刚刚开始"),
array("title"=>"学习javascript","content"=>"《javascript权威指南》真厚!"),
array("title"=>"学习ajax","content"=>"ajax,轻轻的来!"),
);

$output = $json->encode($value);
?>
<script language="javascript" src="json.js"></script>
<script language="javascript">
<!--

var json = JSON.parse('<?=$output?>');

var order = 0;
for(var i=0;i<json.length;i++)
{
order 
= i+1;
document
.write(order+"<br />");
document
.write("<span style='color:red'>" + json['title'+ "</span>");
document
.write("<div style='color:green'>"+json['content'+ "</div>");

document
.write("<br />");
}
//-->
</script>

 

作者: aninfeel 发布日期: 2006-8-21
xml就是为了防止乱码吧?
作者: 猪 发布日期: 2006-8-21
对的,他必须 是U8的编码
作者: 刀鱼 发布日期: 2006-8-21
我也试下去...
作者: sanders_yao 发布日期: 2006-8-21
我使用json的时候就是这样
似乎必须是utf-8才能正常显示

总的来说json是专门为js准备的
而xml不光是为js准备的 只不过js的方法可以解析它罢了
作者: LuckLrj 发布日期: 2006-8-23
我用gb2312怎么没出问题……难道是我人品太好了???
作者: lankelan 发布日期: 2006-9-06
查看源代码,发现JSON试图将非ASCII字符转成UTF16格式,而处理过程中并未对GB有特殊处理,所以会导致错误。

分析了Json.js,在Script这一层上,Json并未对中文进行特殊编码处理。为何在PHP中要多此一举呢? 大概是为了跨平台传输的原因。

解决方法三个:

1,写一个GB2UTF16函数放进去。

2,采用其他编码作为中介。比如:nbase64

3,干脆不做处理。这个最简单。

根据需求,后台与前端均采用GB,UTF转码并无意义。动手改就很容易了。

 


decode函数中,找到:

case 'string':


将处理编码的地方全去掉:

 

case (($ord_var_c >= 0x20&& ($ord_var_c <= 0x7F)):
// characters U-00000000 - U-0000007F (same as ASCII)
$ascii .= $var{$c};
break;

case (($ord_var_c & 0xE0== 0xC0):
// characters U-00000080 - U-000007FF, mask 110XXXXX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8

$char = pack('C*', $ord_var_c, ord($var{$c + 1}));
$c += 1;
$utf16 = $this->utf82utf16($char);
$ascii .= sprintf('u%04s', bin2hex($utf16));
break;

case (($ord_var_c & 0xF0== 0xE0):
// characters U-00000800 - U-0000FFFF, mask 1110XXXX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8

$char = pack('C*', $ord_var_c,
ord($var{$c + 1}),
ord($var{$c + 2}));
$c += 2;
$utf16 = $this->utf82utf16($char);
$ascii .= sprintf('u%04s', bin2hex($utf16));
break;

case (($ord_var_c & 0xF8== 0xF0):
// characters U-00010000 - U-001FFFFF, mask 11110XXX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8

$char = pack('C*', $ord_var_c,
ord($var{$c + 1}),
ord($var{$c + 2}),
ord($var{$c + 3}));
$c += 3;
$utf16 = $this->utf82utf16($char);
$ascii .= sprintf('u%04s', bin2hex($utf16));
break;

case (($ord_var_c & 0xFC== 0xF8):
// characters U-00200000 - U-03FFFFFF, mask 111110XX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8

$char = pack('C*', $ord_var_c,
ord($var{$c + 1}),
ord($var{$c + 2}),
ord($var{$c + 3}),
ord($var{$c + 4}));
$c += 4;
$utf16 = $this->utf82utf16($char);
$ascii .= sprintf('u%04s', bin2hex($utf16));
break;

case (($ord_var_c & 0xFE== 0xFC):
// characters U-04000000 - U-7FFFFFFF, mask 1111110X
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8

$char = pack('C*', $ord_var_c,
ord($var{$c + 1}),
ord($var{$c + 2}),
ord($var{$c + 3}),
ord($var{$c + 4}),
ord($var{$c + 5}));
$c += 5;
$utf16 = $this->utf82utf16($char);
$ascii .= sprintf('u%04s', bin2hex($utf16));
break;


然后加上:


default:
$ascii .=chr($ord_var_c);
break;



测试OK。

encode函数中也是一样,把编码的部分去掉,换上


default: $utf8 .= chr($ord_chrs_c);