php语言的json实现

12年前
由于开发一个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.欢迎大家指出错误!