From 942bee46430fe06e17200a9f5a649768081d6eae Mon Sep 17 00:00:00 2001 From: "ctrlaltca@gmail.com" <> Date: Mon, 19 Mar 2012 11:19:44 +0000 Subject: Droppped php 5.2 support, require 5.3.3 (rc1 was breaking php 5.2 support because of a broken change in TJavaScript::jsonEncode(), but nobody noticed in a month; previous php 5.3 version are broken) Droppped TJSON, not needed anymore Name this 3.2-rc2 (to distinguish problems from users caused by this change) --- framework/Web/Javascripts/TJSON.php | 766 ------------------------------ framework/Web/Javascripts/TJavaScript.php | 96 ++-- 2 files changed, 35 insertions(+), 827 deletions(-) delete mode 100644 framework/Web/Javascripts/TJSON.php (limited to 'framework/Web') diff --git a/framework/Web/Javascripts/TJSON.php b/framework/Web/Javascripts/TJSON.php deleted file mode 100644 index 0b119a99..00000000 --- a/framework/Web/Javascripts/TJSON.php +++ /dev/null @@ -1,766 +0,0 @@ - -* @author Matt Knapp -* @author Brett Stimmerman -* @copyright 2005 Michal Migurski -* @license http://www.opensource.org/licenses/bsd-license.php -* @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198 -*/ - -/** -* Converts to and from JSON format. -* -* @package System.Web.Javascripts -* @author Michal Migurski -* @author Matt Knapp -* @author Brett Stimmerman -* @copyright 2005 Michal Migurski -* @license http://www.php.net/license/3_0.txt PHP License 3.0 -*/ -class TJSON -{ - /** - * Marker constant for JSON::decode(), used to flag stack state - */ - const JSON_SLICE = 1; - - /** - * Marker constant for JSON::decode(), used to flag stack state - */ - const JSON_IN_STR = 2; - - /** - * Marker constant for JSON::decode(), used to flag stack state - */ - const JSON_IN_ARR = 4; - - /** - * Marker constant for JSON::decode(), used to flag stack state - */ - const JSON_IN_OBJ = 8; - - /** - * Marker constant for JSON::decode(), used to flag stack state - */ - const JSON_IN_CMT = 16; - - /** - * Behavior switch for JSON::decode() - */ - const JSON_LOOSE_TYPE = 10; - - /** - * Behavior switch for JSON::decode() - */ - const JSON_STRICT_TYPE = 11; - - /** - * constructs a new JSON instance - * - * @param int $use object behavior: when encoding or decoding, - * be loose or strict about object/array usage - * - * possible values: - * self::JSON_STRICT_TYPE - strict typing, default - * "{...}" syntax creates objects in decode. - * self::JSON_LOOSE_TYPE - loose typing - * "{...}" syntax creates associative arrays in decode. - */ - public function __construct($use=self::JSON_STRICT_TYPE) - { - $this->use = $use; - } - - /** - * encodes an arbitrary variable into JSON format - * - * @param mixed $var any number, boolean, string, array, or object to be encoded. - * see argument 1 to JSON() above for array-parsing behavior. - * if var is a strng, note that encode() always expects it - * to be in ASCII or UTF-8 format! - * - * @return string JSON string representation of input var - * @access public - */ - public function encode($var) - { - switch (gettype($var)) { - case 'boolean': - return $var ? 'true' : 'false'; - - case 'NULL': - return 'null'; - - case 'integer': - return (int) $var; - - case 'double': - case 'float': - $locale=localeConv(); - if($locale['decimal_point']=='.') - return (float) $var; - else - return str_replace($locale['decimal_point'], '.', (float)$var); - - case 'string': - if (($g=Prado::getApplication()->getGlobalization(false))!==null && - strtoupper($enc=$g->getCharset())!='UTF-8') - $var=iconv($enc, 'UTF-8', $var); - - // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT - $ascii = ''; - $strlen_var = strlen($var); - - /* - * Iterate over every character in the string, - * escaping with a slash or encoding to UTF-8 where necessary - */ - for ($c = 0; $c < $strlen_var; ++$c) { - - $ord_var_c = ord($var{$c}); - - switch (true) { - case $ord_var_c == 0x08: - $ascii .= '\b'; - break; - case $ord_var_c == 0x09: - $ascii .= '\t'; - break; - case $ord_var_c == 0x0A: - $ascii .= '\n'; - break; - case $ord_var_c == 0x0C: - $ascii .= '\f'; - break; - case $ord_var_c == 0x0D: - $ascii .= '\r'; - break; - - case $ord_var_c == 0x22: - case $ord_var_c == 0x2F: - case $ord_var_c == 0x5C: - // double quote, slash, slosh - $ascii .= '\\'.$var{$c}; - break; - - case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): - // characters U-00000000 - U-0000007F (same as ASCII) - $ascii .= $var{$c}; - break; - - case (($ord_var_c & 0xE0) == 0xC0): - // characters U-00000080 - U-000007FF, mask 110XXXXX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $char = pack('C*', $ord_var_c, ord($var{$c+1})); - $c+=1; - $utf16 = $this->utf8_to_utf16be($char); - $ascii .= sprintf('\u%04s', bin2hex($utf16)); - break; - - case (($ord_var_c & 0xF0) == 0xE0): - // characters U-00000800 - U-0000FFFF, mask 1110XXXX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $char = pack('C*', $ord_var_c, - ord($var{$c+1}), - ord($var{$c+2})); - $c+=2; - $utf16 = $this->utf8_to_utf16be($char); - $ascii .= sprintf('\u%04s', bin2hex($utf16)); - break; - - case (($ord_var_c & 0xF8) == 0xF0): - // characters U-00010000 - U-001FFFFF, mask 11110XXX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $char = pack('C*', $ord_var_c, - ord($var{$c+1}), - ord($var{$c+2}), - ord($var{$c+3})); - $c+=3; - $utf16 = $this->utf8_to_utf16be($char); - $ascii .= sprintf('\u%04s', bin2hex($utf16)); - break; - - case (($ord_var_c & 0xFC) == 0xF8): - // characters U-00200000 - U-03FFFFFF, mask 111110XX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $char = pack('C*', $ord_var_c, - ord($var{$c+1}), - ord($var{$c+2}), - ord($var{$c+3}), - ord($var{$c+4})); - $c+=4; - $utf16 = $this->utf8_to_utf16be($char); - $ascii .= sprintf('\u%04s', bin2hex($utf16)); - break; - - case (($ord_var_c & 0xFE) == 0xFC): - // characters U-04000000 - U-7FFFFFFF, mask 1111110X - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $char = pack('C*', $ord_var_c, - ord($var{$c+1}), - ord($var{$c+2}), - ord($var{$c+3}), - ord($var{$c+4}), - ord($var{$c+5})); - $c+=5; - $utf16 = $this->utf8_to_utf16be($char); - $ascii .= sprintf('\u%04s', bin2hex($utf16)); - break; - } - } - - return '"'.$ascii.'"'; - - case 'array': - /* - * As per JSON spec if any array key is not an integer - * we must treat the the whole array as an object. We - * also try to catch a sparsely populated associative - * array with numeric keys here because some JS engines - * will create an array with empty indexes up to - * max_index which can cause memory issues and because - * the keys, which may be relevant, will be remapped - * otherwise. - * - * As per the ECMA and JSON specification an object may - * have any string as a property. Unfortunately due to - * a hole in the ECMA specification if the key is a - * ECMA reserved word or starts with a digit the - * parameter is only accessible using ECMAScript's - * bracket notation. - */ - - // treat as a JSON object - if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) { - return '{' . - join(',', array_map(array($this, 'name_value'), - array_keys($var), - array_values($var))) - . '}'; - } - - // treat it like a regular array - return '[' . join(',', array_map(array($this, 'encode'), $var)) . ']'; - - case 'object': - $vars = get_object_vars($var); - return '{' . - join(',', array_map(array($this, 'name_value'), - array_keys($vars), - array_values($vars))) - . '}'; - - default: - return ''; - } - } - - /** - * encodes an arbitrary variable into JSON format, alias for encode() - * @see JSON::encode() - * - * @param mixed $var any number, boolean, string, array, or object to be encoded. - * see argument 1 to JSON() above for array-parsing behavior. - * if var is a strng, note that encode() always expects it - * to be in ASCII or UTF-8 format! - * - * @return string JSON string representation of input var - * @access public - */ - public function enc($var) - { - return $this->encode($var); - } - - /** function name_value - * array-walking function for use in generating JSON-formatted name-value pairs - * - * @param string $name name of key to use - * @param mixed $value reference to an array element to be encoded - * - * @return string JSON-formatted name-value pair, like '"name":value' - * @access private - */ - protected function name_value($name, $value) - { - return $this->encode(strval($name)) . ':' . $this->encode($value); - } - - /** - * reduce a string by removing leading and trailing comments and whitespace - * - * @param $str string string value to strip of comments and whitespace - * - * @return string string value stripped of comments and whitespace - * @access private - */ - protected function reduce_string($str) - { - $str = preg_replace(array( - - // eliminate single line comments in '// ...' form - '#^\s*//(.+)$#m', - - // eliminate multi-line comments in '/* ... */' form, at start of string - '#^\s*/\*(.+)\*/#Us', - - // eliminate multi-line comments in '/* ... */' form, at end of string - '#/\*(.+)\*/\s*$#Us' - - ), '', $str); - - // eliminate extraneous space - return trim($str); - } - - /** - * decodes a JSON string into appropriate variable - * - * @param string $str JSON-formatted string - * - * @return mixed number, boolean, string, array, or object - * corresponding to given JSON input string. - * See argument 1 to JSON() above for object-output behavior. - * Note that decode() always returns strings - * in ASCII or UTF-8 format! - * @access public - */ - public function decode($str) - { - $str = $this->reduce_string($str); - - switch (strtolower($str)) { - case 'true': - return true; - - case 'false': - return false; - - case 'null': - return null; - - default: - if (is_numeric($str)) { - // Lookie-loo, it's a number - - // This would work on its own, but I'm trying to be - // good about returning integers where appropriate: - // return (float)$str; - - // Return float or int, as appropriate - return ((float)$str == (integer)$str) - ? (integer)$str - : (float)$str; - - } elseif (preg_match('/^("|\').+(\1)$/s', $str, $m) && $m[1] == $m[2]) { - // STRINGS RETURNED IN UTF-8 FORMAT - $delim = substr($str, 0, 1); - $chrs = substr($str, 1, -1); - $utf8 = ''; - $strlen_chrs = strlen($chrs); - - for ($c = 0; $c < $strlen_chrs; ++$c) { - - $substr_chrs_c_2 = substr($chrs, $c, 2); - $ord_chrs_c = ord($chrs{$c}); - - switch (true) { - case $substr_chrs_c_2 == '\b': - $utf8 .= chr(0x08); - ++$c; - break; - case $substr_chrs_c_2 == '\t': - $utf8 .= chr(0x09); - ++$c; - break; - case $substr_chrs_c_2 == '\n': - $utf8 .= chr(0x0A); - ++$c; - break; - case $substr_chrs_c_2 == '\f': - $utf8 .= chr(0x0C); - ++$c; - break; - case $substr_chrs_c_2 == '\r': - $utf8 .= chr(0x0D); - ++$c; - break; - - case $substr_chrs_c_2 == '\\"': - case $substr_chrs_c_2 == '\\\'': - case $substr_chrs_c_2 == '\\\\': - case $substr_chrs_c_2 == '\\/': - if (($delim == '"' && $substr_chrs_c_2 != '\\\'') || - ($delim == "'" && $substr_chrs_c_2 != '\\"')) { - $utf8 .= $chrs{++$c}; - } - break; - - case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)): - // single, escaped unicode character - $utf16 = chr(hexdec(substr($chrs, ($c+2), 2))) - . chr(hexdec(substr($chrs, ($c+4), 2))); - $utf8 .= $this->utf16be_to_utf8($utf16); - $c+=5; - break; - - case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F): - $utf8 .= $chrs{$c}; - break; - - case ($ord_chrs_c & 0xE0) == 0xC0: - // characters U-00000080 - U-000007FF, mask 110XXXXX - //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $utf8 .= substr($chrs, $c, 2); - ++$c; - break; - - case ($ord_chrs_c & 0xF0) == 0xE0: - // characters U-00000800 - U-0000FFFF, mask 1110XXXX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $utf8 .= substr($chrs, $c, 3); - $c += 2; - break; - - case ($ord_chrs_c & 0xF8) == 0xF0: - // characters U-00010000 - U-001FFFFF, mask 11110XXX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $utf8 .= substr($chrs, $c, 4); - $c += 3; - break; - - case ($ord_chrs_c & 0xFC) == 0xF8: - // characters U-00200000 - U-03FFFFFF, mask 111110XX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $utf8 .= substr($chrs, $c, 5); - $c += 4; - break; - - case ($ord_chrs_c & 0xFE) == 0xFC: - // characters U-04000000 - U-7FFFFFFF, mask 1111110X - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $utf8 .= substr($chrs, $c, 6); - $c += 5; - break; - - } - - } - - return $utf8; - - } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) { - // array, or object notation - - if ($str{0} == '[') { - $stk = array(self::JSON_IN_ARR); - $arr = array(); - } else { - if ($this->use == self::JSON_LOOSE_TYPE) { - $stk = array(self::JSON_IN_OBJ); - $obj = array(); - } else { - $stk = array(self::JSON_IN_OBJ); - $obj = new stdClass(); - } - } - - array_push($stk, array('what' => self::JSON_SLICE, - 'where' => 0, - 'delim' => false)); - - $chrs = substr($str, 1, -1); - $chrs = $this->reduce_string($chrs); - - if ($chrs == '') { - if (reset($stk) == self::JSON_IN_ARR) { - return $arr; - - } else { - return $obj; - - } - } - - //print("\nparsing {$chrs}\n"); - - $strlen_chrs = strlen($chrs); - - for ($c = 0; $c <= $strlen_chrs; ++$c) { - - $top = end($stk); - $substr_chrs_c_2 = substr($chrs, $c, 2); - - if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == self::JSON_SLICE))) { - // found a comma that is not inside a string, array, etc., - // OR we've reached the end of the character list - $slice = substr($chrs, $top['where'], ($c - $top['where'])); - array_push($stk, array('what' => self::JSON_SLICE, 'where' => ($c + 1), 'delim' => false)); - //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); - - if (reset($stk) == self::JSON_IN_ARR) { - // we are in an array, so just push an element onto the stack - array_push($arr, $this->decode($slice)); - - } elseif (reset($stk) == self::JSON_IN_OBJ) { - // we are in an object, so figure - // out the property name and set an - // element in an associative array, - // for now - if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { - // "name":value pair - $key = $this->decode($parts[1]); - $val = $this->decode($parts[2]); - - if ($this->use == self::JSON_LOOSE_TYPE) { - $obj[$key] = $val; - } else { - $obj->$key = $val; - } - } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { - // name:value pair, where name is unquoted - $key = $parts[1]; - $val = $this->decode($parts[2]); - - if ($this->use == self::JSON_LOOSE_TYPE) { - $obj[$key] = $val; - } else { - $obj->$key = $val; - } - } - - } - - } elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != self::JSON_IN_STR)) { - // found a quote, and we are not inside a string - array_push($stk, array('what' => self::JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c})); - //print("Found start of string at {$c}\n"); - - } elseif (($chrs{$c} == $top['delim']) && - ($top['what'] == self::JSON_IN_STR) && - (($chrs{$c - 1} != "\\") || - ($chrs{$c - 1} == "\\" && $chrs{$c - 2} == "\\"))) { - // found a quote, we're in a string, and it's not escaped - array_pop($stk); - //print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n"); - - } elseif (($chrs{$c} == '[') && - in_array($top['what'], array(self::JSON_SLICE, self::JSON_IN_ARR, self::JSON_IN_OBJ))) { - // found a left-bracket, and we are in an array, object, or slice - array_push($stk, array('what' => self::JSON_IN_ARR, 'where' => $c, 'delim' => false)); - //print("Found start of array at {$c}\n"); - - } elseif (($chrs{$c} == ']') && ($top['what'] == self::JSON_IN_ARR)) { - // found a right-bracket, and we're in an array - array_pop($stk); - //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); - - } elseif (($chrs{$c} == '{') && - in_array($top['what'], array(self::JSON_SLICE, self::JSON_IN_ARR, self::JSON_IN_OBJ))) { - // found a left-brace, and we are in an array, object, or slice - array_push($stk, array('what' => self::JSON_IN_OBJ, 'where' => $c, 'delim' => false)); - //print("Found start of object at {$c}\n"); - - } elseif (($chrs{$c} == '}') && ($top['what'] == self::JSON_IN_OBJ)) { - // found a right-brace, and we're in an object - array_pop($stk); - //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); - - } elseif (($substr_chrs_c_2 == '/*') && - in_array($top['what'], array(self::JSON_SLICE, self::JSON_IN_ARR, self::JSON_IN_OBJ))) { - // found a comment start, and we are in an array, object, or slice - array_push($stk, array('what' => self::JSON_IN_CMT, 'where' => $c, 'delim' => false)); - $c++; - //print("Found start of comment at {$c}\n"); - - } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == self::JSON_IN_CMT)) { - // found a comment end, and we're in one now - array_pop($stk); - $c++; - - for ($i = $top['where']; $i <= $c; ++$i) - $chrs = substr_replace($chrs, ' ', $i, 1); - - //print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); - - } - - } - - if (reset($stk) == self::JSON_IN_ARR) { - return $arr; - - } elseif (reset($stk) == self::JSON_IN_OBJ) { - return $obj; - - } - - } - } - } - - /** - * decodes a JSON string into appropriate variable; alias for decode() - * @see JSON::decode() - * - * @param string $str JSON-formatted string - * - * @return mixed number, boolean, string, array, or object - * corresponding to given JSON input string. - * See argument 1 to JSON() above for object-output behavior. - * Note that decode() always returns strings - * in ASCII or UTF-8 format! - */ - public function dec($var) - { - return $this->decode($var); - } - - - /** - * This function returns any UTF-8 encoded text as a list of - * Unicode values: - * - * @author Scott Michael Reynen - * @link http://www.randomchaos.com/document.php?source=php_and_unicode - * @see unicode_to_utf8() - */ - protected function utf8_to_unicode( &$str ) - { - $unicode = array(); - $values = array(); - $lookingFor = 1; - - for ($i = 0; $i < strlen( $str ); $i++ ) - { - $thisValue = ord( $str[ $i ] ); - if ( $thisValue < 128 ) - $unicode[] = $thisValue; - else - { - if ( count( $values ) == 0 ) - $lookingFor = ( $thisValue < 224 ) ? 2 : 3; - $values[] = $thisValue; - if ( count( $values ) == $lookingFor ) - { - $number = ( $lookingFor == 3 ) ? - ( ( $values[0] % 16 ) * 4096 ) + ( ( $values[1] % 64 ) * 64 ) + ( $values[2] % 64 ): - ( ( $values[0] % 32 ) * 64 ) + ( $values[1] % 64 ); - $unicode[] = $number; - $values = array(); - $lookingFor = 1; - } - } - } - return $unicode; - } - - /** - * This function converts a Unicode array back to its UTF-8 representation - * - * @author Scott Michael Reynen - * @link http://www.randomchaos.com/document.php?source=php_and_unicode - * @see utf8_to_unicode() - */ - protected function unicode_to_utf8( &$str ) - { - $utf8 = ''; - foreach( $str as $unicode ) - { - if ( $unicode < 128 ) - { - $utf8.= chr( $unicode ); - } - elseif ( $unicode < 2048 ) - { - $utf8.= chr( 192 + ( ( $unicode - ( $unicode % 64 ) ) / 64 ) ); - $utf8.= chr( 128 + ( $unicode % 64 ) ); - } - else - { - $utf8.= chr( 224 + ( ( $unicode - ( $unicode % 4096 ) ) / 4096 ) ); - $utf8.= chr( 128 + ( ( ( $unicode % 4096 ) - ( $unicode % 64 ) ) / 64 ) ); - $utf8.= chr( 128 + ( $unicode % 64 ) ); - } - } - return $utf8; - } - - /** - * UTF-8 to UTF-16BE conversion. - * - * Maybe really UCS-2 without mb_string due to utf8_to_unicode limits - */ - protected function utf8_to_utf16be(&$str, $bom = false) - { - $out = $bom ? "\xFE\xFF" : ''; - if(function_exists('mb_convert_encoding')) - return $out.mb_convert_encoding($str,'UTF-16BE','UTF-8'); - - $uni = $this->utf8_to_unicode($str); - foreach($uni as $cp) - $out .= pack('n',$cp); - return $out; - } - - /** - * UTF-8 to UTF-16BE conversion. - * - * Maybe really UCS-2 without mb_string due to utf8_to_unicode limits - */ - protected function utf16be_to_utf8(&$str) - { - $uni = unpack('n*',$str); - return $this->unicode_to_utf8($uni); - } - -} - -?> \ No newline at end of file diff --git a/framework/Web/Javascripts/TJavaScript.php b/framework/Web/Javascripts/TJavaScript.php index 6ef3b466..4f12eb94 100644 --- a/framework/Web/Javascripts/TJavaScript.php +++ b/framework/Web/Javascripts/TJavaScript.php @@ -23,11 +23,6 @@ */ class TJavaScript { - /** - * @var TJSON JSON decoder and encoder instance - */ - private static $_json; - /** * Renders a list of javascript files * @param array URLs to the javascript files @@ -200,82 +195,61 @@ class TJavaScript /** * Encodes a PHP variable into javascript string. - * This method invokes {@TJSON} utility class to perform the encoding. + * This method invokes json_encode to perform the encoding. * @param mixed variable to be encoded * @return string encoded string */ public static function jsonEncode($value, $options = 0) { - if (function_exists('json_encode')) - { - if (is_string($value) && - ($g=Prado::getApplication()->getGlobalization(false))!==null && - strtoupper($enc=$g->getCharset())!='UTF-8') - $value=iconv($enc, 'UTF-8', $value); - $s = json_encode($value,$options); - self::checkJsonError(); - return $s; - } - - if(self::$_json === null) - self::$_json = Prado::createComponent('System.Web.Javascripts.TJSON'); - return self::$_json->encode($value); + if (is_string($value) && + ($g=Prado::getApplication()->getGlobalization(false))!==null && + strtoupper($enc=$g->getCharset())!='UTF-8') + $value=iconv($enc, 'UTF-8', $value); + $s = json_encode($value,$options); + self::checkJsonError(); + return $s; } /** * Decodes a javascript string into PHP variable. - * This method invokes {@TJSON} utility class to perform the decoding. + * This method invokes json_decode to perform the decoding. * @param string string to be decoded * @return mixed decoded variable */ public static function jsonDecode($value) { - if (function_exists('json_decode')) - { - $s= json_decode($value); - self::checkJsonError(); - return $s; - } - if(self::$_json === null) - self::$_json = Prado::createComponent('System.Web.Javascripts.TJSON'); - return self::$_json->decode($value); + $s= json_decode($value); + self::checkJsonError(); + return $s; } private static function checkJsonError() { - // requires php 5.3.0 - if (function_exists('json_last_error')) + switch ($err = json_last_error()) { - // requires php 5.3.3 - if(!defined('JSON_ERROR_UTF8')) - define('JSON_ERROR_UTF8', null); - - switch ($err = json_last_error()) - { - case JSON_ERROR_NONE: - return; - break; - case JSON_ERROR_DEPTH: - $msg = 'Maximum stack depth exceeded'; - break; - case JSON_ERROR_STATE_MISMATCH: - $msg = 'Underflow or the modes mismatch'; - break; - case JSON_ERROR_CTRL_CHAR: - $msg = 'Unexpected control character found'; - break; - case JSON_ERROR_SYNTAX: - $msg = 'Syntax error, malformed JSON'; - break; - case JSON_ERROR_UTF8: - $msg = 'Malformed UTF-8 characters, possibly incorrectly encoded'; - break; - default: - $msg = 'Unknown error'; - break; - } - throw new Exception("JSON error ($err): $msg"); + case JSON_ERROR_NONE: + return; + break; + case JSON_ERROR_DEPTH: + $msg = 'Maximum stack depth exceeded'; + break; + case JSON_ERROR_STATE_MISMATCH: + $msg = 'Underflow or the modes mismatch'; + break; + case JSON_ERROR_CTRL_CHAR: + $msg = 'Unexpected control character found'; + break; + case JSON_ERROR_SYNTAX: + $msg = 'Syntax error, malformed JSON'; + break; + case JSON_ERROR_UTF8: + $msg = 'Malformed UTF-8 characters, possibly incorrectly encoded'; + break; + default: + $msg = 'Unknown error'; + break; } + throw new Exception("JSON error ($err): $msg"); } /** -- cgit v1.2.3