php语言的json实现

5
PHP JSON C/C++ Go 36992 次浏览
由于开发一个ajax file manager for web开源项目,数据交换使用的json格式,后来发现在低版本的php上运行会有问题,仔细调试发现json_decode和json_encode无法正常工作,于是查阅资料,发现低版本的php没有实现这两个函数,为了兼容性,我只好自己实现一个php版的json编码解码代码,并保证和json2.js的一致,测试调试并通过,现在将其公布出来,供有相同需求的同学使用:
<?php
/* * ****************************************************************************
 * $base: $
 *
 * $Author:  $
 * 		Berlin Qin
 *
 * $History: base.js $
 *      Berlin Qin    2011/5/15         created
 *
 * $contacted
 *      webfmt@gmail.com
 *      www.webfmt.com
 *
 * *************************************************************************** */
/* ===========================================================================
 * license
 *
 * 1、Open Source Licenses
 * webfmt is distributed under the GPL, LGPL and MPL open source licenses.
 * This triple copyleft licensing model avoids incompatibility with other open source licenses.
 * These Open Source licenses are specially indicated for:
 *   Integrating webfmt into Open Source software;
 *   Personal and educational use of webfmt;
 *   Integrating webfmt in commercial software,
 *  taking care of satisfying the Open Source licenses terms,
 *   while not able or interested on supporting webfmt and its development.
 *
 * 2、Commercial License – fbis source Closed Distribution License - CDL
 * For many companies and products, Open Source licenses are not an option.
 * This is why the fbis source Closed Distribution License (CDL) has been introduced.
 * It is a non-copyleft license which gives companies complete freedom
 * when integrating webfmt into their products and web sites.
 * This license offers a very flexible way to integrate webfmt in your commercial application.
 * These are the main advantages it offers over an Open Source license:
 *     Modifications and enhancements doesn't need to be released under an Open Source license;
 *     There is no need to distribute any Open Source license terms alongside with your product
 * and no reference to it have to be done;
 *     No references to webfmt have to be done in any file distributed with your product;
 *     The source code of webfmt doesn’t have to be distributed alongside with your product;
 *     You can remove any file from webfmt when integrating it with your product.
 * The CDL is a lifetime license valid for all releases of webfmt published during
 * and before the year following its purchase.
 * It's valid for webfmt releases also. It includes 1 year of personal e-mail support.
 *
 * ************************************************************************************************************************************************* */

function jsonDecode($json)
{
    $result = array();
    try
    {
        if (PHP_VERSION_ID > 50300)
        {
            $result = (array) json_decode($json);
        }
        else
        {
            $json = str_replace(array("\\\\", "\\\""), array("&#92;", "&#34;"), $json);
            $parts = preg_split("@(\"[^\"]*\")|([\[\]\{\},:])|\s@is", $json, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
            foreach ($parts as $index => $part)
            {
                if (strlen($part) == 1)
                {
                    switch ($part)
                    {
                        case "[":
                        case "{":
                            $parts[$index] = "array(";
                            break;
                        case "]":
                        case "}":
                            $parts[$index] = ")";
                            break;
                        case ":":
                            $parts[$index] = "=>";
                            break;
                        case ",":
                            break;
                        default:
                            break;
                    }
                }
            }
            $json = str_replace(array("&#92;", "&#34;", "$"), array("\\\\", "\\\"", "\\$"), implode("", $parts));
            $result = eval("return $json;");
        }
    }
    catch (Exception $e)
    {
        $result = array("error" => $e->getCode());
    }
    return $result;
}

function valueTostr($val)
{
    if (is_string($val)) 
    {
        $val = str_replace('\"', "\\\"", $val);
        $val = str_replace("\\", "\\\\", $val);
        $val = str_replace("/", "\\/", $val);
        $val = str_replace("\t", "\\t", $val);
        $val = str_replace("\n", "\\n", $val);
        $val = str_replace("\r", "\\r", $val);
        $val = str_replace("\b", "\\b", $val);
        $val = str_replace("\f", "\\f", $val);
        return '"' . $val . '"';
    }
    elseif (is_int($val))
        return sprintf('%d', $val);
    elseif (is_float($val))
        return sprintf('%F', $val);
    elseif (is_bool($val))
        return ($val ? 'true' : 'false');
    else
        return 'null';
}

function jsonEncode($arr)
{
    $result = "{}";
    try
    {
        if (PHP_VERSION_ID > 50300)
        {
            $result = json_encode($arr);
        }
        else
        {
            $parts = array();
            $is_list = false;
            if (!is_array($arr))
            {
                $arr = (array) $arr;
            }
            $end = count($arr) - 1;
            if (count($arr) > 0)
            {
                if (is_numeric(key($arr)))
                {
                    $result = "[";  
                    for ($i = 0; $i < count($arr); $i++)
                    {
                        if (is_array($arr[$i]))
                        {
                            $result = $result . jsonEncode($arr[$i]);
                        }
                        else
                        {
                            $result = $result . valueTostr($arr[$i]);
                        }
                        if ($i != $end)
                        {
                            $result = $result . ",";
                        }
                    }
                    $result = $result . "]";
                }
                else
                {
                    $result = "{"; 
                    $i = 0;
                    foreach ($arr as $key => $value)
                    {
                        $result = $result . '"' . $key . '":';
                        if (is_array($value))
                        {
                            $result = $result . jsonEncode($value);
                        }
                        else
                        {
                            $result = $result . valueTostr($value);
                        }
                        if ($i != $end)
                        {
                            $result = $result . ",";
                        }
                        $i++;
                    }
                    $result = $result . "}";
                }
            }
            else
            {
                $result = "[]";
            }
        }
    }
    catch (Exception $e)
    {

    }
    return $result;
}
?>
如果使用过程有什么问题,可以给我email.欢迎大家指出错误!
来自:http://www.open-open.com/home/space.php?uid=37854&do=blog&id=5014
请尽量让自己的答案能够对别人有帮助

12个答案

默认排序 按投票排序