php語言的json實現
由于開發一個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("\", """), $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("\", """, "$"), 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;
} ?></pre>如果使用過程有什么問題,可以給我email.歡迎大家指出錯誤!</div>