大家可能都有接触过JSON数据,而json_encode与json_decode这两个函数是在PHP 5.0及以后的版本中引入的内置功能。如果尝试在早于PHP 5.0的环境中使用它们,可能需要安装额外的扩展。但在某些情形下,我们可能没有权限调整服务器设置,此时可以考虑编写自定义函数以模拟这两个内置函数的行为。实际上,任何系统提供的内置函数都能够通过手工编写类似功能的函数来替代。在此之前,我曾撰写过一篇关于如何手工实现json_decode功能的文章,而现在我认为也有必要提供一个json_encode的手工实现版本。为了确保函数没有重复定义,可以利用PHP中的function_exists函数来进行检查。
-
-
- if (!function_exists('json_encode')) {
- function json_encode($array = array()) {
- if (!is_array($array)) return null;
-
- $json = "";
- $i = 1;
- $comma = ",";
- $count = count($array);
-
- foreach ($array as $k => $v) {
- if ($i === $count) $comma = "";
-
- if (!is_array($v)) {
- $v = addslashes($v);
- $json .= '"'.$k.'":"'.$v.'"'.$comma;
- } else {
- $json .= '"'.$k.'":'.json_encode($v).$comma;
- }
-
- $i++;
- }
-
- $json = '{'.$json.'}';
- return $json;
- }
- }
-
- if (!function_exists('json_decode')) {
- function json_decode($json, $assoc = true) {
- $comment = false;
- $out = '$x=';
-
- $json = preg_replace('/:([^"}]+?)([,|}])/i', ':"\1"\2', $json);
-
- for ($i = 0; $i < strlen($json); $i++) {
- if (!$comment) {
- if (($json[$i] == '{') || ($json[$i] == '[')) {
- $out .= 'array(';
- } elseif (($json[$i] == '}') || ($json[$i] == ']')) {
- $out .= ')';
- } elseif ($json[$i] == ':') {
- $out .= '=>';
- } elseif ($json[$i] == ',') {
- $out .= ',';
- } elseif ($json[$i] == '"') {
- $out .= '"';
- }
- } else {
- $out .= $json[$i] == '?' ? '\\' : $json[$i];
- }
-
- if ($json[$i] === '"' && $json[$i - 1] !== '\\') {
- $comment = !$comment;
- }
- }
-
- eval($out . ';');
- return $x;
- }
- }
-
复制代码
|