phplibrary/core/json.php
2016-07-14 16:29:26 +03:00

97 lines
3.1 KiB
PHP

<?php
/**
* http://phptunes.blogspot.com/2007/01/phpjson.html
*/
class json
{
static $DEFAULT_ENCODING = 'windows-1251//IGNORE';
static $INTERNAL_ENCODING = 'utf-8';
static function encode($var)
{
return php2js($var); //json_encode(self::prepare($var, array('self', 'unicode_encode')));
}
// Преобразование json в массив
static function decode($var, $encoding = 'utf-8', $is_array = false)
{
if ($encoding != 'utf-8') $var = iconv($encoding, self::$INTERNAL_ENCODING, $var);
return self::prepare(json_decode($var, $is_array), array('self', 'unicode_decode'));
}
static function ident($var)
{
return $var;
}
/* windows-1251 -> utf-8 */
static function unicode_encode($var)
{
return @iconv(self::$DEFAULT_ENCODING, self::$INTERNAL_ENCODING, $var);
}
/* utf-8 -> windows-1251 */
static function unicode_decode($var)
{
return @iconv(self::$INTERNAL_ENCODING, self::$DEFAULT_ENCODING, $var);
}
static function prepare($var, $encode)
{
if (is_array($var)) {
$new = array();
foreach ($var as $k => $v) {
$new[self::prepare($k, $encode)] = self::prepare($v, $encode);
}
$var = $new;
} elseif (is_object($var)) {
// Было преобразование типа для отображения !!
$vars = get_object_vars($var);
foreach ($vars as $m => $v) {
$var->$m = self::prepare($var->$m, $encode);
}
} elseif (is_string($var)) {
$var = call_user_func($encode, $var);
}
return $var;
}
}
function php2js($a = false) {
if (is_null($a)) return 'null';
if ($a === false) return 'false';
if ($a === true) return 'true';
if (is_scalar($a)) {
if (is_float($a)) {
// Always use "." for floats.
$a = str_replace(",", ".", strval($a));
} else if (is_int($a)) {
return $a;
}
// All scalars are converted to strings to avoid indeterminism.
// PHP's "1" and 1 are equal for all PHP operators, but
// JS's "1" and 1 are not. So if we pass "1" or 1 from the PHP backend,
// we should get the same result in the JS frontend (string).
// Character replacements for JSON.
static $jsonReplaces = array(
array("\\", "/", "\n", "\t", "\r", "\b", "\f", '"'),
array('\\\\', '\\/', '\\n', '\\t', '\\r', '\\b', '\\f', '\"'));
return '"' . str_replace($jsonReplaces[0], $jsonReplaces[1], $a) . '"';
}
$isList = true;
for ($i = 0, reset($a);$i < count($a);$i++, next($a)) {
if (key($a) !== $i) {
$isList = false;
break;
}
}
$result = array();
if ($isList) {
foreach($a as $v) $result[] = php2js($v);
return '[' . join(',', $result) . ']';
} else {
foreach($a as $k => $v) $result[] = php2js($k) . ':' . php2js($v);
return '{' . join(',', $result) . '}';
}
}