• 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.baiduhome.net/home/space.php?uid=37854&do=blog&id=5014

    相似問題

    相關經驗

    相關資訊

    相關文檔

  • sesese色