IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    json_encode的php实现

    admin发表于 2011-02-25 09:53:44
    love 0



    今天coding时,需要将php中的变量返回给第三方,第一个想到就是使用json格式,方便易用。于是用了json_encode,但是发现居然报语法错误,查了手册才发现,json_enode 是在5.2.0才作为标准扩展加入php的,而我们的机器上php的版本是5.1.6,原来该扩展还未加进来。由于这个应用比较小,而且本人赖得升级php的版本,而且再手工安装这个扩展也比较麻烦,所以想到了使用php实现json_encode,原理上应该不难,找到一段代码,共享之~

    代码如下:

    
    function __json_encode( $data ) {           
        if( is_array($data) || is_object($data) ) {
            $islist = is_array($data) && ( empty($data) || array_keys($data) === range(0,count($data)-1) );
     
            if( $islist ) {
                $json = '[' . implode(',', array_map('__json_encode', $data) ) . ']';
            } else {
                $items = Array();
                foreach( $data as $key => $value ) {
                    $items[] = __json_encode("$key") . ':' . __json_encode($value);
                }
                $json = '{' . implode(',', $items) . '}';
            }
        } elseif( is_string($data) ) {
            # Escape non-printable or Non-ASCII characters.
            # I also put the \\ character first, as suggested in comments on the 'addclashes' page.
            $string = '"' . addcslashes($data, "\\\"\n\r\t/" . chr(8) . chr(12)) . '"';
            $json    = '';
            $len    = strlen($string);
            # Convert UTF-8 to Hexadecimal Codepoints.
            for( $i = 0; $i < $len; $i++ ) {
     
                $char = $string[$i];
                $c1 = ord($char);
     
                # Single byte;
                if( $c1 <128 ) {
                    $json .= ($c1 > 31) ? $char : sprintf("\\u%04x", $c1);
                    continue;
                }
     
                # Double byte
                $c2 = ord($string[++$i]);
                if ( ($c1 & 32) === 0 ) {
                    $json .= sprintf("\\u%04x", ($c1 - 192) * 64 + $c2 - 128);
                    continue;
                }
     
                # Triple
                $c3 = ord($string[++$i]);
                if( ($c1 & 16) === 0 ) {
                    $json .= sprintf("\\u%04x", (($c1 - 224) <<12) + (($c2 - 128) << 6) + ($c3 - 128));
                    continue;
                }
     
                # Quadruple
                $c4 = ord($string[++$i]);
                if( ($c1 & 8 ) === 0 ) {
                    $u = (($c1 & 15) << 2) + (($c2>>4) & 3) - 1;
     
                    $w1 = (54<<10) + ($u<<6) + (($c2 & 15) << 2) + (($c3>>4) & 3);
                    $w2 = (55<<10) + (($c3 & 15)<<6) + ($c4-128);
                    $json .= sprintf("\\u%04x\\u%04x", $w1, $w2);
                }
            }
        } else {
            # int, floats, bools, null
            $json = strtolower(var_export( $data, true ));
        }
        return $json;
    }
    ?>

    您可能对下面文章也感兴趣:

    • [转]PHP函数的实现原理及性能分析
    • 在PHP里使用closure实现prototype风格的扩展方式[zz]
    • php中EOF和STR的用法
    • PHP中session_unset与session_destroy的区别
    • PHP:md5的返回值转化为两个int64的方法


沪ICP备19023445号-2号
友情链接