JSON讨论


最近看到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 ); 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值