--- a/includes/json2.php Sun Mar 28 21:49:26 2010 -0400
+++ b/includes/json2.php Sun Mar 28 23:10:46 2010 -0400
@@ -29,379 +29,379 @@
*/
class Zend_Json_Encoder
{
- /**
- * Whether or not to check for possible cycling
- *
- * @var boolean
- */
- protected $_cycleCheck;
+ /**
+ * Whether or not to check for possible cycling
+ *
+ * @var boolean
+ */
+ protected $_cycleCheck;
- /**
- * Array of visited objects; used to prevent cycling.
- *
- * @var array
- */
- protected $_visited = array();
+ /**
+ * Array of visited objects; used to prevent cycling.
+ *
+ * @var array
+ */
+ protected $_visited = array();
- /**
- * Constructor
- *
- * @param boolean $cycleCheck Whether or not to check for recursion when encoding
- * @return void
- */
- protected function __construct($cycleCheck = false)
- {
- $this->_cycleCheck = $cycleCheck;
- }
+ /**
+ * Constructor
+ *
+ * @param boolean $cycleCheck Whether or not to check for recursion when encoding
+ * @return void
+ */
+ protected function __construct($cycleCheck = false)
+ {
+ $this->_cycleCheck = $cycleCheck;
+ }
- /**
- * Use the JSON encoding scheme for the value specified
- *
- * @param mixed $value The value to be encoded
- * @param boolean $cycleCheck Whether or not to check for possible object recursion when encoding
- * @return string The encoded value
- */
- public static function encode($value, $cycleCheck = false)
- {
- $encoder = new Zend_Json_Encoder(($cycleCheck) ? true : false);
+ /**
+ * Use the JSON encoding scheme for the value specified
+ *
+ * @param mixed $value The value to be encoded
+ * @param boolean $cycleCheck Whether or not to check for possible object recursion when encoding
+ * @return string The encoded value
+ */
+ public static function encode($value, $cycleCheck = false)
+ {
+ $encoder = new Zend_Json_Encoder(($cycleCheck) ? true : false);
- return $encoder->_encodeValue($value);
- }
+ return $encoder->_encodeValue($value);
+ }
- /**
- * Recursive driver which determines the type of value to be encoded
- * and then dispatches to the appropriate method. $values are either
- * - objects (returns from {@link _encodeObject()})
- * - arrays (returns from {@link _encodeArray()})
- * - basic datums (e.g. numbers or strings) (returns from {@link _encodeDatum()})
- *
- * @param $value mixed The value to be encoded
- * @return string Encoded value
- */
- protected function _encodeValue(&$value)
- {
- if (is_object($value)) {
- return $this->_encodeObject($value);
- } else if (is_array($value)) {
- return $this->_encodeArray($value);
- }
+ /**
+ * Recursive driver which determines the type of value to be encoded
+ * and then dispatches to the appropriate method. $values are either
+ * - objects (returns from {@link _encodeObject()})
+ * - arrays (returns from {@link _encodeArray()})
+ * - basic datums (e.g. numbers or strings) (returns from {@link _encodeDatum()})
+ *
+ * @param $value mixed The value to be encoded
+ * @return string Encoded value
+ */
+ protected function _encodeValue(&$value)
+ {
+ if (is_object($value)) {
+ return $this->_encodeObject($value);
+ } else if (is_array($value)) {
+ return $this->_encodeArray($value);
+ }
- return $this->_encodeDatum($value);
- }
+ return $this->_encodeDatum($value);
+ }
- /**
- * Encode an object to JSON by encoding each of the public properties
- *
- * A special property is added to the JSON object called '__className'
- * that contains the name of the class of $value. This is used to decode
- * the object on the client into a specific class.
- *
- * @param $value object
- * @return string
- * @throws Zend_Json_Exception If recursive checks are enabled and the object has been serialized previously
- */
- protected function _encodeObject(&$value)
- {
- if ($this->_cycleCheck) {
- if ($this->_wasVisited($value)) {
- throw new Zend_Json_Exception(
- 'Cycles not supported in JSON encoding, cycle introduced by '
- . 'class "' . get_class($value) . '"'
- );
- }
+ /**
+ * Encode an object to JSON by encoding each of the public properties
+ *
+ * A special property is added to the JSON object called '__className'
+ * that contains the name of the class of $value. This is used to decode
+ * the object on the client into a specific class.
+ *
+ * @param $value object
+ * @return string
+ * @throws Zend_Json_Exception If recursive checks are enabled and the object has been serialized previously
+ */
+ protected function _encodeObject(&$value)
+ {
+ if ($this->_cycleCheck) {
+ if ($this->_wasVisited($value)) {
+ throw new Zend_Json_Exception(
+ 'Cycles not supported in JSON encoding, cycle introduced by '
+ . 'class "' . get_class($value) . '"'
+ );
+ }
- $this->_visited[] = $value;
- }
+ $this->_visited[] = $value;
+ }
- $props = '';
- foreach (get_object_vars($value) as $name => $propValue) {
- if (isset($propValue)) {
- $props .= ','
- . $this->_encodeValue($name)
- . ':'
- . $this->_encodeValue($propValue);
- }
- }
+ $props = '';
+ foreach (get_object_vars($value) as $name => $propValue) {
+ if (isset($propValue)) {
+ $props .= ','
+ . $this->_encodeValue($name)
+ . ':'
+ . $this->_encodeValue($propValue);
+ }
+ }
- return '{"__className":"' . get_class($value) . '"'
- . $props . '}';
- }
+ return '{"__className":"' . get_class($value) . '"'
+ . $props . '}';
+ }
- /**
- * Determine if an object has been serialized already
- *
- * @param mixed $value
- * @return boolean
- */
- protected function _wasVisited(&$value)
- {
- if (in_array($value, $this->_visited, true)) {
- return true;
- }
+ /**
+ * Determine if an object has been serialized already
+ *
+ * @param mixed $value
+ * @return boolean
+ */
+ protected function _wasVisited(&$value)
+ {
+ if (in_array($value, $this->_visited, true)) {
+ return true;
+ }
- return false;
- }
+ return false;
+ }
- /**
- * JSON encode an array value
- *
- * Recursively encodes each value of an array and returns a JSON encoded
- * array string.
- *
- * Arrays are defined as integer-indexed arrays starting at index 0, where
- * the last index is (count($array) -1); any deviation from that is
- * considered an associative array, and will be encoded as such.
- *
- * @param $array array
- * @return string
- */
- protected function _encodeArray(&$array)
- {
- $tmpArray = array();
+ /**
+ * JSON encode an array value
+ *
+ * Recursively encodes each value of an array and returns a JSON encoded
+ * array string.
+ *
+ * Arrays are defined as integer-indexed arrays starting at index 0, where
+ * the last index is (count($array) -1); any deviation from that is
+ * considered an associative array, and will be encoded as such.
+ *
+ * @param $array array
+ * @return string
+ */
+ protected function _encodeArray(&$array)
+ {
+ $tmpArray = array();
- // Check for associative array
- if (!empty($array) && (array_keys($array) !== range(0, count($array) - 1))) {
- // Associative array
- $result = '{';
- foreach ($array as $key => $value) {
- $key = (string) $key;
- $tmpArray[] = $this->_encodeString($key)
- . ':'
- . $this->_encodeValue($value);
- }
- $result .= implode(',', $tmpArray);
- $result .= '}';
- } else {
- // Indexed array
- $result = '[';
- $length = count($array);
- for ($i = 0; $i < $length; $i++) {
- $tmpArray[] = $this->_encodeValue($array[$i]);
- }
- $result .= implode(',', $tmpArray);
- $result .= ']';
- }
+ // Check for associative array
+ if (!empty($array) && (array_keys($array) !== range(0, count($array) - 1))) {
+ // Associative array
+ $result = '{';
+ foreach ($array as $key => $value) {
+ $key = (string) $key;
+ $tmpArray[] = $this->_encodeString($key)
+ . ':'
+ . $this->_encodeValue($value);
+ }
+ $result .= implode(',', $tmpArray);
+ $result .= '}';
+ } else {
+ // Indexed array
+ $result = '[';
+ $length = count($array);
+ for ($i = 0; $i < $length; $i++) {
+ $tmpArray[] = $this->_encodeValue($array[$i]);
+ }
+ $result .= implode(',', $tmpArray);
+ $result .= ']';
+ }
- return $result;
- }
+ return $result;
+ }
- /**
- * JSON encode a basic data type (string, number, boolean, null)
- *
- * If value type is not a string, number, boolean, or null, the string
- * 'null' is returned.
- *
- * @param $value mixed
- * @return string
- */
- protected function _encodeDatum(&$value)
- {
- $result = 'null';
+ /**
+ * JSON encode a basic data type (string, number, boolean, null)
+ *
+ * If value type is not a string, number, boolean, or null, the string
+ * 'null' is returned.
+ *
+ * @param $value mixed
+ * @return string
+ */
+ protected function _encodeDatum(&$value)
+ {
+ $result = 'null';
- if (is_int($value) || is_float($value)) {
- $result = (string)$value;
- } elseif (is_string($value)) {
- $result = $this->_encodeString($value);
- } elseif (is_bool($value)) {
- $result = $value ? 'true' : 'false';
- }
+ if (is_int($value) || is_float($value)) {
+ $result = (string)$value;
+ } elseif (is_string($value)) {
+ $result = $this->_encodeString($value);
+ } elseif (is_bool($value)) {
+ $result = $value ? 'true' : 'false';
+ }
- return $result;
- }
+ return $result;
+ }
- /**
- * JSON encode a string value by escaping characters as necessary
- *
- * @param $value string
- * @return string
- */
- protected function _encodeString(&$string)
- {
- // Escape these characters with a backslash:
- // " \ / \n \r \t \b \f
- $search = array('\\', "\n", "\t", "\r", "\b", "\f", '"');
- $replace = array('\\\\', '\\n', '\\t', '\\r', '\\b', '\\f', '\"');
- $string = str_replace($search, $replace, $string);
+ /**
+ * JSON encode a string value by escaping characters as necessary
+ *
+ * @param $value string
+ * @return string
+ */
+ protected function _encodeString(&$string)
+ {
+ // Escape these characters with a backslash:
+ // " \ / \n \r \t \b \f
+ $search = array('\\', "\n", "\t", "\r", "\b", "\f", '"');
+ $replace = array('\\\\', '\\n', '\\t', '\\r', '\\b', '\\f', '\"');
+ $string = str_replace($search, $replace, $string);
- // Escape certain ASCII characters:
- // 0x08 => \b
- // 0x0c => \f
- $string = str_replace(array(chr(0x08), chr(0x0C)), array('\b', '\f'), $string);
+ // Escape certain ASCII characters:
+ // 0x08 => \b
+ // 0x0c => \f
+ $string = str_replace(array(chr(0x08), chr(0x0C)), array('\b', '\f'), $string);
- return '"' . $string . '"';
- }
+ return '"' . $string . '"';
+ }
- /**
- * Encode the constants associated with the ReflectionClass
- * parameter. The encoding format is based on the class2 format
- *
- * @param $cls ReflectionClass
- * @return string Encoded constant block in class2 format
- */
- private static function _encodeConstants(ReflectionClass $cls)
- {
- $result = "constants : {";
- $constants = $cls->getConstants();
+ /**
+ * Encode the constants associated with the ReflectionClass
+ * parameter. The encoding format is based on the class2 format
+ *
+ * @param $cls ReflectionClass
+ * @return string Encoded constant block in class2 format
+ */
+ private static function _encodeConstants(ReflectionClass $cls)
+ {
+ $result = "constants : {";
+ $constants = $cls->getConstants();
- $tmpArray = array();
- if (!empty($constants)) {
- foreach ($constants as $key => $value) {
- $tmpArray[] = "$key: " . self::encode($value);
- }
+ $tmpArray = array();
+ if (!empty($constants)) {
+ foreach ($constants as $key => $value) {
+ $tmpArray[] = "$key: " . self::encode($value);
+ }
- $result .= implode(', ', $tmpArray);
- }
+ $result .= implode(', ', $tmpArray);
+ }
- return $result . "}";
- }
+ return $result . "}";
+ }
- /**
- * Encode the public methods of the ReflectionClass in the
- * class2 format
- *
- * @param $cls ReflectionClass
- * @return string Encoded method fragment
- *
- */
- private static function _encodeMethods(ReflectionClass $cls)
- {
- $methods = $cls->getMethods();
- $result = 'methods:{';
+ /**
+ * Encode the public methods of the ReflectionClass in the
+ * class2 format
+ *
+ * @param $cls ReflectionClass
+ * @return string Encoded method fragment
+ *
+ */
+ private static function _encodeMethods(ReflectionClass $cls)
+ {
+ $methods = $cls->getMethods();
+ $result = 'methods:{';
- $started = false;
- foreach ($methods as $method) {
- if (! $method->isPublic() || !$method->isUserDefined()) {
- continue;
- }
+ $started = false;
+ foreach ($methods as $method) {
+ if (! $method->isPublic() || !$method->isUserDefined()) {
+ continue;
+ }
- if ($started) {
- $result .= ',';
- }
- $started = true;
+ if ($started) {
+ $result .= ',';
+ }
+ $started = true;
- $result .= '' . $method->getName(). ':function(';
+ $result .= '' . $method->getName(). ':function(';
- if ('__construct' != $method->getName()) {
- $parameters = $method->getParameters();
- $paramCount = count($parameters);
- $argsStarted = false;
+ if ('__construct' != $method->getName()) {
+ $parameters = $method->getParameters();
+ $paramCount = count($parameters);
+ $argsStarted = false;
- $argNames = "var argNames=[";
- foreach ($parameters as $param) {
- if ($argsStarted) {
- $result .= ',';
- }
+ $argNames = "var argNames=[";
+ foreach ($parameters as $param) {
+ if ($argsStarted) {
+ $result .= ',';
+ }
- $result .= $param->getName();
+ $result .= $param->getName();
- if ($argsStarted) {
- $argNames .= ',';
- }
+ if ($argsStarted) {
+ $argNames .= ',';
+ }
- $argNames .= '"' . $param->getName() . '"';
+ $argNames .= '"' . $param->getName() . '"';
- $argsStarted = true;
- }
- $argNames .= "];";
+ $argsStarted = true;
+ }
+ $argNames .= "];";
- $result .= "){"
- . $argNames
- . 'var result = ZAjaxEngine.invokeRemoteMethod('
- . "this, '" . $method->getName()
- . "',argNames,arguments);"
- . 'return(result);}';
- } else {
- $result .= "){}";
- }
- }
+ $result .= "){"
+ . $argNames
+ . 'var result = ZAjaxEngine.invokeRemoteMethod('
+ . "this, '" . $method->getName()
+ . "',argNames,arguments);"
+ . 'return(result);}';
+ } else {
+ $result .= "){}";
+ }
+ }
- return $result . "}";
- }
+ return $result . "}";
+ }
- /**
- * Encode the public properties of the ReflectionClass in the class2
- * format.
- *
- * @param $cls ReflectionClass
- * @return string Encode properties list
- *
- */
- private static function _encodeVariables(ReflectionClass $cls)
- {
- $properties = $cls->getProperties();
- $propValues = get_class_vars($cls->getName());
- $result = "variables:{";
- $cnt = 0;
+ /**
+ * Encode the public properties of the ReflectionClass in the class2
+ * format.
+ *
+ * @param $cls ReflectionClass
+ * @return string Encode properties list
+ *
+ */
+ private static function _encodeVariables(ReflectionClass $cls)
+ {
+ $properties = $cls->getProperties();
+ $propValues = get_class_vars($cls->getName());
+ $result = "variables:{";
+ $cnt = 0;
- $tmpArray = array();
- foreach ($properties as $prop) {
- if (! $prop->isPublic()) {
- continue;
- }
+ $tmpArray = array();
+ foreach ($properties as $prop) {
+ if (! $prop->isPublic()) {
+ continue;
+ }
- $tmpArray[] = $prop->getName()
- . ':'
- . self::encode($propValues[$prop->getName()]);
- }
- $result .= implode(',', $tmpArray);
+ $tmpArray[] = $prop->getName()
+ . ':'
+ . self::encode($propValues[$prop->getName()]);
+ }
+ $result .= implode(',', $tmpArray);
- return $result . "}";
- }
+ return $result . "}";
+ }
- /**
- * Encodes the given $className into the class2 model of encoding PHP
- * classes into JavaScript class2 classes.
- * NOTE: Currently only public methods and variables are proxied onto
- * the client machine
- *
- * @param $className string The name of the class, the class must be
- * instantiable using a null constructor
- * @param $package string Optional package name appended to JavaScript
- * proxy class name
- * @return string The class2 (JavaScript) encoding of the class
- * @throws Zend_Json_Exception
- */
- public static function encodeClass($className, $package = '')
- {
- $cls = new ReflectionClass($className);
- if (! $cls->isInstantiable()) {
- throw new Zend_Json_Exception("$className must be instantiable");
- }
+ /**
+ * Encodes the given $className into the class2 model of encoding PHP
+ * classes into JavaScript class2 classes.
+ * NOTE: Currently only public methods and variables are proxied onto
+ * the client machine
+ *
+ * @param $className string The name of the class, the class must be
+ * instantiable using a null constructor
+ * @param $package string Optional package name appended to JavaScript
+ * proxy class name
+ * @return string The class2 (JavaScript) encoding of the class
+ * @throws Zend_Json_Exception
+ */
+ public static function encodeClass($className, $package = '')
+ {
+ $cls = new ReflectionClass($className);
+ if (! $cls->isInstantiable()) {
+ throw new Zend_Json_Exception("$className must be instantiable");
+ }
- return "Class.create('$package$className',{"
- . self::_encodeConstants($cls) .","
- . self::_encodeMethods($cls) .","
- . self::_encodeVariables($cls) .'});';
- }
+ return "Class.create('$package$className',{"
+ . self::_encodeConstants($cls) .","
+ . self::_encodeMethods($cls) .","
+ . self::_encodeVariables($cls) .'});';
+ }
- /**
- * Encode several classes at once
- *
- * Returns JSON encoded classes, using {@link encodeClass()}.
- *
- * @param array $classNames
- * @param string $package
- * @return string
- */
- public static function encodeClasses(array $classNames, $package = '')
- {
- $result = '';
- foreach ($classNames as $className) {
- $result .= self::encodeClass($className, $package);
- }
+ /**
+ * Encode several classes at once
+ *
+ * Returns JSON encoded classes, using {@link encodeClass()}.
+ *
+ * @param array $classNames
+ * @param string $package
+ * @return string
+ */
+ public static function encodeClasses(array $classNames, $package = '')
+ {
+ $result = '';
+ foreach ($classNames as $className) {
+ $result .= self::encodeClass($className, $package);
+ }
- return $result;
- }
+ return $result;
+ }
}
@@ -415,536 +415,536 @@
*/
class Zend_Json_Decoder
{
- /**
- * Parse tokens used to decode the JSON object. These are not
- * for public consumption, they are just used internally to the
- * class.
- */
- const EOF = 0;
- const DATUM = 1;
- const LBRACE = 2;
- const LBRACKET = 3;
- const RBRACE = 4;
- const RBRACKET = 5;
- const COMMA = 6;
- const COLON = 7;
+ /**
+ * Parse tokens used to decode the JSON object. These are not
+ * for public consumption, they are just used internally to the
+ * class.
+ */
+ const EOF = 0;
+ const DATUM = 1;
+ const LBRACE = 2;
+ const LBRACKET = 3;
+ const RBRACE = 4;
+ const RBRACKET = 5;
+ const COMMA = 6;
+ const COLON = 7;
- /**
- * Use to maintain a "pointer" to the source being decoded
- *
- * @var string
- */
- protected $_source;
+ /**
+ * Use to maintain a "pointer" to the source being decoded
+ *
+ * @var string
+ */
+ protected $_source;
- /**
- * Caches the source length
- *
- * @var int
- */
- protected $_sourceLength;
+ /**
+ * Caches the source length
+ *
+ * @var int
+ */
+ protected $_sourceLength;
- /**
- * The offset within the souce being decoded
- *
- * @var int
- *
- */
- protected $_offset;
+ /**
+ * The offset within the souce being decoded
+ *
+ * @var int
+ *
+ */
+ protected $_offset;
- /**
- * The current token being considered in the parser cycle
- *
- * @var int
- */
- protected $_token;
+ /**
+ * The current token being considered in the parser cycle
+ *
+ * @var int
+ */
+ protected $_token;
- /**
- * Flag indicating how objects should be decoded
- *
- * @var int
- * @access protected
- */
- protected $_decodeType;
+ /**
+ * Flag indicating how objects should be decoded
+ *
+ * @var int
+ * @access protected
+ */
+ protected $_decodeType;
- /**
- * Constructor
- *
- * @param string $source String source to decode
- * @param int $decodeType How objects should be decoded -- see
- * {@link Zend_Json::TYPE_ARRAY} and {@link Zend_Json::TYPE_OBJECT} for
- * valid values
- * @return void
- */
- protected function __construct($source, $decodeType)
- {
-
- // eliminate comments
- $source = preg_replace(array(
+ /**
+ * Constructor
+ *
+ * @param string $source String source to decode
+ * @param int $decodeType How objects should be decoded -- see
+ * {@link Zend_Json::TYPE_ARRAY} and {@link Zend_Json::TYPE_OBJECT} for
+ * valid values
+ * @return void
+ */
+ protected function __construct($source, $decodeType)
+ {
+
+ // eliminate comments
+ $source = 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'
-
- ), '', $source);
-
- // Set defaults
- $this->_source = $source;
- $this->_sourceLength = strlen($source);
- $this->_token = self::EOF;
- $this->_offset = 0;
+ // 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'
+
+ ), '', $source);
+
+ // Set defaults
+ $this->_source = $source;
+ $this->_sourceLength = strlen($source);
+ $this->_token = self::EOF;
+ $this->_offset = 0;
- // Normalize and set $decodeType
- if (!in_array($decodeType, array(Zend_Json::TYPE_ARRAY, Zend_Json::TYPE_OBJECT)))
- {
- $decodeType = Zend_Json::TYPE_ARRAY;
- }
- $this->_decodeType = $decodeType;
+ // Normalize and set $decodeType
+ if (!in_array($decodeType, array(Zend_Json::TYPE_ARRAY, Zend_Json::TYPE_OBJECT)))
+ {
+ $decodeType = Zend_Json::TYPE_ARRAY;
+ }
+ $this->_decodeType = $decodeType;
- // Set pointer at first token
- $this->_getNextToken();
- }
+ // Set pointer at first token
+ $this->_getNextToken();
+ }
- /**
- * Decode a JSON source string
- *
- * Decodes a JSON encoded string. The value returned will be one of the
- * following:
- * - integer
- * - float
- * - boolean
- * - null
- * - StdClass
- * - array
- * - array of one or more of the above types
- *
- * By default, decoded objects will be returned as associative arrays; to
- * return a StdClass object instead, pass {@link Zend_Json::TYPE_OBJECT} to
- * the $objectDecodeType parameter.
- *
- * Throws a Zend_Json_Exception if the source string is null.
- *
- * @static
- * @access public
- * @param string $source String to be decoded
- * @param int $objectDecodeType How objects should be decoded; should be
- * either or {@link Zend_Json::TYPE_ARRAY} or
- * {@link Zend_Json::TYPE_OBJECT}; defaults to TYPE_ARRAY
- * @return mixed
- * @throws Zend_Json_Exception
- */
- public static function decode($source = null, $objectDecodeType = Zend_Json::TYPE_ARRAY)
- {
- if (null === $source) {
- throw new Zend_Json_Exception('Must specify JSON encoded source for decoding');
- } elseif (!is_string($source)) {
- throw new Zend_Json_Exception('Can only decode JSON encoded strings');
- }
+ /**
+ * Decode a JSON source string
+ *
+ * Decodes a JSON encoded string. The value returned will be one of the
+ * following:
+ * - integer
+ * - float
+ * - boolean
+ * - null
+ * - StdClass
+ * - array
+ * - array of one or more of the above types
+ *
+ * By default, decoded objects will be returned as associative arrays; to
+ * return a StdClass object instead, pass {@link Zend_Json::TYPE_OBJECT} to
+ * the $objectDecodeType parameter.
+ *
+ * Throws a Zend_Json_Exception if the source string is null.
+ *
+ * @static
+ * @access public
+ * @param string $source String to be decoded
+ * @param int $objectDecodeType How objects should be decoded; should be
+ * either or {@link Zend_Json::TYPE_ARRAY} or
+ * {@link Zend_Json::TYPE_OBJECT}; defaults to TYPE_ARRAY
+ * @return mixed
+ * @throws Zend_Json_Exception
+ */
+ public static function decode($source = null, $objectDecodeType = Zend_Json::TYPE_ARRAY)
+ {
+ if (null === $source) {
+ throw new Zend_Json_Exception('Must specify JSON encoded source for decoding');
+ } elseif (!is_string($source)) {
+ throw new Zend_Json_Exception('Can only decode JSON encoded strings');
+ }
- $decoder = new self($source, $objectDecodeType);
+ $decoder = new self($source, $objectDecodeType);
- return $decoder->_decodeValue();
- }
+ return $decoder->_decodeValue();
+ }
- /**
- * Recursive driving rountine for supported toplevel tops
- *
- * @return mixed
- */
- protected function _decodeValue()
- {
- switch ($this->_token) {
- case self::DATUM:
- $result = $this->_tokenValue;
- $this->_getNextToken();
- return($result);
- break;
- case self::LBRACE:
- return($this->_decodeObject());
- break;
- case self::LBRACKET:
- return($this->_decodeArray());
- break;
- default:
- return null;
- break;
- }
- }
+ /**
+ * Recursive driving rountine for supported toplevel tops
+ *
+ * @return mixed
+ */
+ protected function _decodeValue()
+ {
+ switch ($this->_token) {
+ case self::DATUM:
+ $result = $this->_tokenValue;
+ $this->_getNextToken();
+ return($result);
+ break;
+ case self::LBRACE:
+ return($this->_decodeObject());
+ break;
+ case self::LBRACKET:
+ return($this->_decodeArray());
+ break;
+ default:
+ return null;
+ break;
+ }
+ }
- /**
- * Decodes an object of the form:
- * { "attribute: value, "attribute2" : value,...}
- *
- * If ZJsonEnoder or ZJAjax was used to encode the original object
- * then a special attribute called __className which specifies a class
- * name that should wrap the data contained within the encoded source.
- *
- * Decodes to either an array or StdClass object, based on the value of
- * {@link $_decodeType}. If invalid $_decodeType present, returns as an
- * array.
- *
- * @return array|StdClass
- */
- protected function _decodeObject()
- {
- $members = array();
- $tok = $this->_getNextToken();
+ /**
+ * Decodes an object of the form:
+ * { "attribute: value, "attribute2" : value,...}
+ *
+ * If ZJsonEnoder or ZJAjax was used to encode the original object
+ * then a special attribute called __className which specifies a class
+ * name that should wrap the data contained within the encoded source.
+ *
+ * Decodes to either an array or StdClass object, based on the value of
+ * {@link $_decodeType}. If invalid $_decodeType present, returns as an
+ * array.
+ *
+ * @return array|StdClass
+ */
+ protected function _decodeObject()
+ {
+ $members = array();
+ $tok = $this->_getNextToken();
- while ($tok && $tok != self::RBRACE) {
- if ($tok != self::DATUM || ! is_string($this->_tokenValue)) {
- throw new Zend_Json_Exception('Missing key in object encoding: ' . $this->_source);
- }
+ while ($tok && $tok != self::RBRACE) {
+ if ($tok != self::DATUM || ! is_string($this->_tokenValue)) {
+ throw new Zend_Json_Exception('Missing key in object encoding: ' . $this->_source);
+ }
- $key = $this->_tokenValue;
- $tok = $this->_getNextToken();
+ $key = $this->_tokenValue;
+ $tok = $this->_getNextToken();
- if ($tok != self::COLON) {
- throw new Zend_Json_Exception('Missing ":" in object encoding: ' . $this->_source);
- }
+ if ($tok != self::COLON) {
+ throw new Zend_Json_Exception('Missing ":" in object encoding: ' . $this->_source);
+ }
- $tok = $this->_getNextToken();
- $members[$key] = $this->_decodeValue();
- $tok = $this->_token;
+ $tok = $this->_getNextToken();
+ $members[$key] = $this->_decodeValue();
+ $tok = $this->_token;
- if ($tok == self::RBRACE) {
- break;
- }
+ if ($tok == self::RBRACE) {
+ break;
+ }
- if ($tok != self::COMMA) {
- throw new Zend_Json_Exception('Missing "," in object encoding: ' . $this->_source);
- }
+ if ($tok != self::COMMA) {
+ throw new Zend_Json_Exception('Missing "," in object encoding: ' . $this->_source);
+ }
- $tok = $this->_getNextToken();
- }
+ $tok = $this->_getNextToken();
+ }
- switch ($this->_decodeType) {
- case Zend_Json::TYPE_OBJECT:
- // Create new StdClass and populate with $members
- $result = new StdClass();
- foreach ($members as $key => $value) {
- $result->$key = $value;
- }
- break;
- case Zend_Json::TYPE_ARRAY:
- default:
- $result = $members;
- break;
- }
+ switch ($this->_decodeType) {
+ case Zend_Json::TYPE_OBJECT:
+ // Create new StdClass and populate with $members
+ $result = new StdClass();
+ foreach ($members as $key => $value) {
+ $result->$key = $value;
+ }
+ break;
+ case Zend_Json::TYPE_ARRAY:
+ default:
+ $result = $members;
+ break;
+ }
- $this->_getNextToken();
- return $result;
- }
+ $this->_getNextToken();
+ return $result;
+ }
- /**
- * Decodes a JSON array format:
- * [element, element2,...,elementN]
- *
- * @return array
- */
- protected function _decodeArray()
- {
- $result = array();
- $starttok = $tok = $this->_getNextToken(); // Move past the '['
- $index = 0;
+ /**
+ * Decodes a JSON array format:
+ * [element, element2,...,elementN]
+ *
+ * @return array
+ */
+ protected function _decodeArray()
+ {
+ $result = array();
+ $starttok = $tok = $this->_getNextToken(); // Move past the '['
+ $index = 0;
- while ($tok && $tok != self::RBRACKET) {
- $result[$index++] = $this->_decodeValue();
+ while ($tok && $tok != self::RBRACKET) {
+ $result[$index++] = $this->_decodeValue();
- $tok = $this->_token;
+ $tok = $this->_token;
- if ($tok == self::RBRACKET || !$tok) {
- break;
- }
+ if ($tok == self::RBRACKET || !$tok) {
+ break;
+ }
- if ($tok != self::COMMA) {
- throw new Zend_Json_Exception('Missing "," in array encoding: ' . $this->_source);
- }
+ if ($tok != self::COMMA) {
+ throw new Zend_Json_Exception('Missing "," in array encoding: ' . $this->_source);
+ }
- $tok = $this->_getNextToken();
- }
+ $tok = $this->_getNextToken();
+ }
- $this->_getNextToken();
- return($result);
- }
+ $this->_getNextToken();
+ return($result);
+ }
- /**
- * Removes whitepsace characters from the source input
- */
- protected function _eatWhitespace()
- {
- if (preg_match(
- '/([\t\b\f\n\r ])*/s',
- $this->_source,
- $matches,
- PREG_OFFSET_CAPTURE,
- $this->_offset)
- && $matches[0][1] == $this->_offset)
- {
- $this->_offset += strlen($matches[0][0]);
- }
- }
+ /**
+ * Removes whitepsace characters from the source input
+ */
+ protected function _eatWhitespace()
+ {
+ if (preg_match(
+ '/([\t\b\f\n\r ])*/s',
+ $this->_source,
+ $matches,
+ PREG_OFFSET_CAPTURE,
+ $this->_offset)
+ && $matches[0][1] == $this->_offset)
+ {
+ $this->_offset += strlen($matches[0][0]);
+ }
+ }
- /**
- * Retrieves the next token from the source stream
- *
- * @return int Token constant value specified in class definition
- */
- protected function _getNextToken()
- {
- $this->_token = self::EOF;
- $this->_tokenValue = null;
- $this->_eatWhitespace();
-
- if ($this->_offset >= $this->_sourceLength) {
- return(self::EOF);
- }
+ /**
+ * Retrieves the next token from the source stream
+ *
+ * @return int Token constant value specified in class definition
+ */
+ protected function _getNextToken()
+ {
+ $this->_token = self::EOF;
+ $this->_tokenValue = null;
+ $this->_eatWhitespace();
+
+ if ($this->_offset >= $this->_sourceLength) {
+ return(self::EOF);
+ }
- $str = $this->_source;
- $str_length = $this->_sourceLength;
- $i = $this->_offset;
- $start = $i;
-
- switch ($str{$i}) {
- case '{':
- $this->_token = self::LBRACE;
- break;
- case '}':
- $this->_token = self::RBRACE;
- break;
- case '[':
- $this->_token = self::LBRACKET;
- break;
- case ']':
- $this->_token = self::RBRACKET;
- break;
- case ',':
- $this->_token = self::COMMA;
- break;
- case ':':
- $this->_token = self::COLON;
- break;
- case '"':
- $result = '';
- do {
- $i++;
- if ($i >= $str_length) {
- break;
- }
+ $str = $this->_source;
+ $str_length = $this->_sourceLength;
+ $i = $this->_offset;
+ $start = $i;
+
+ switch ($str{$i}) {
+ case '{':
+ $this->_token = self::LBRACE;
+ break;
+ case '}':
+ $this->_token = self::RBRACE;
+ break;
+ case '[':
+ $this->_token = self::LBRACKET;
+ break;
+ case ']':
+ $this->_token = self::RBRACKET;
+ break;
+ case ',':
+ $this->_token = self::COMMA;
+ break;
+ case ':':
+ $this->_token = self::COLON;
+ break;
+ case '"':
+ $result = '';
+ do {
+ $i++;
+ if ($i >= $str_length) {
+ break;
+ }
- $chr = $str{$i};
- if ($chr == '\\') {
- $i++;
- if ($i >= $str_length) {
- break;
- }
- $chr = $str{$i};
- switch ($chr) {
- case '"' :
- $result .= '"';
- break;
- case '\\':
- $result .= '\\';
- break;
- case '/' :
- $result .= '/';
- break;
- case 'b' :
- $result .= chr(8);
- break;
- case 'f' :
- $result .= chr(12);
- break;
- case 'n' :
- $result .= chr(10);
- break;
- case 'r' :
- $result .= chr(13);
- break;
- case 't' :
- $result .= chr(9);
- break;
- case '\'' :
- $result .= '\'';
- break;
- case 'u':
- $result .= self::decode_unicode_byte(substr($str, $i + 1, 4));
- $i += 4;
- break;
- default:
- throw new Zend_Json_Exception("Illegal escape "
- . "sequence '" . $chr . "'");
- }
- } elseif ($chr == '"') {
- break;
- } else {
- $result .= $chr;
- }
- } while ($i < $str_length);
+ $chr = $str{$i};
+ if ($chr == '\\') {
+ $i++;
+ if ($i >= $str_length) {
+ break;
+ }
+ $chr = $str{$i};
+ switch ($chr) {
+ case '"' :
+ $result .= '"';
+ break;
+ case '\\':
+ $result .= '\\';
+ break;
+ case '/' :
+ $result .= '/';
+ break;
+ case 'b' :
+ $result .= chr(8);
+ break;
+ case 'f' :
+ $result .= chr(12);
+ break;
+ case 'n' :
+ $result .= chr(10);
+ break;
+ case 'r' :
+ $result .= chr(13);
+ break;
+ case 't' :
+ $result .= chr(9);
+ break;
+ case '\'' :
+ $result .= '\'';
+ break;
+ case 'u':
+ $result .= self::decode_unicode_byte(substr($str, $i + 1, 4));
+ $i += 4;
+ break;
+ default:
+ throw new Zend_Json_Exception("Illegal escape "
+ . "sequence '" . $chr . "'");
+ }
+ } elseif ($chr == '"') {
+ break;
+ } else {
+ $result .= $chr;
+ }
+ } while ($i < $str_length);
- $this->_token = self::DATUM;
- //$this->_tokenValue = substr($str, $start + 1, $i - $start - 1);
- $this->_tokenValue = $result;
- break;
- case "'":
- $result = '';
- do {
- $i++;
- if ($i >= $str_length) {
- break;
- }
+ $this->_token = self::DATUM;
+ //$this->_tokenValue = substr($str, $start + 1, $i - $start - 1);
+ $this->_tokenValue = $result;
+ break;
+ case "'":
+ $result = '';
+ do {
+ $i++;
+ if ($i >= $str_length) {
+ break;
+ }
- $chr = $str{$i};
- if ($chr == '\\') {
- $i++;
- if ($i >= $str_length) {
- break;
- }
- $chr = $str{$i};
- switch ($chr) {
- case "'" :
- $result .= "'";
- break;
- case '\\':
- $result .= '\\';
- break;
- case '/' :
- $result .= '/';
- break;
- case 'b' :
- $result .= chr(8);
- break;
- case 'f' :
- $result .= chr(12);
- break;
- case 'n' :
- $result .= chr(10);
- break;
- case 'r' :
- $result .= chr(13);
- break;
- case 't' :
- $result .= chr(9);
- break;
- case '"' :
- $result .= '"';
- break;
- default:
- throw new Zend_Json_Exception("Illegal escape "
- . "sequence '" . $chr . "'");
- }
- } elseif ($chr == "'") {
- break;
- } else {
- $result .= $chr;
- }
- } while ($i < $str_length);
+ $chr = $str{$i};
+ if ($chr == '\\') {
+ $i++;
+ if ($i >= $str_length) {
+ break;
+ }
+ $chr = $str{$i};
+ switch ($chr) {
+ case "'" :
+ $result .= "'";
+ break;
+ case '\\':
+ $result .= '\\';
+ break;
+ case '/' :
+ $result .= '/';
+ break;
+ case 'b' :
+ $result .= chr(8);
+ break;
+ case 'f' :
+ $result .= chr(12);
+ break;
+ case 'n' :
+ $result .= chr(10);
+ break;
+ case 'r' :
+ $result .= chr(13);
+ break;
+ case 't' :
+ $result .= chr(9);
+ break;
+ case '"' :
+ $result .= '"';
+ break;
+ default:
+ throw new Zend_Json_Exception("Illegal escape "
+ . "sequence '" . $chr . "'");
+ }
+ } elseif ($chr == "'") {
+ break;
+ } else {
+ $result .= $chr;
+ }
+ } while ($i < $str_length);
- $this->_token = self::DATUM;
- //$this->_tokenValue = substr($str, $start + 1, $i - $start - 1);
- $this->_tokenValue = $result;
- break;
- case 't':
- if (($i+ 3) < $str_length && substr($str, $start, 4) == "true") {
- $this->_token = self::DATUM;
- }
- $this->_tokenValue = true;
- $i += 3;
- break;
- case 'f':
- if (($i+ 4) < $str_length && substr($str, $start, 5) == "false") {
- $this->_token = self::DATUM;
- }
- $this->_tokenValue = false;
- $i += 4;
- break;
- case 'n':
- if (($i+ 3) < $str_length && substr($str, $start, 4) == "null") {
- $this->_token = self::DATUM;
- }
- $this->_tokenValue = NULL;
- $i += 3;
- break;
- case ' ':
- break;
- }
+ $this->_token = self::DATUM;
+ //$this->_tokenValue = substr($str, $start + 1, $i - $start - 1);
+ $this->_tokenValue = $result;
+ break;
+ case 't':
+ if (($i+ 3) < $str_length && substr($str, $start, 4) == "true") {
+ $this->_token = self::DATUM;
+ }
+ $this->_tokenValue = true;
+ $i += 3;
+ break;
+ case 'f':
+ if (($i+ 4) < $str_length && substr($str, $start, 5) == "false") {
+ $this->_token = self::DATUM;
+ }
+ $this->_tokenValue = false;
+ $i += 4;
+ break;
+ case 'n':
+ if (($i+ 3) < $str_length && substr($str, $start, 4) == "null") {
+ $this->_token = self::DATUM;
+ }
+ $this->_tokenValue = NULL;
+ $i += 3;
+ break;
+ case ' ':
+ break;
+ }
- if ($this->_token != self::EOF) {
- $this->_offset = $i + 1; // Consume the last token character
- return($this->_token);
- }
+ if ($this->_token != self::EOF) {
+ $this->_offset = $i + 1; // Consume the last token character
+ return($this->_token);
+ }
- $chr = $str{$i};
- if ($chr == '-' || $chr == '.' || ($chr >= '0' && $chr <= '9')) {
- if (preg_match('/-?([0-9])*(\.[0-9]*)?((e|E)((-|\+)?)[0-9]+)?/s',
- $str, $matches, PREG_OFFSET_CAPTURE, $start) && $matches[0][1] == $start) {
+ $chr = $str{$i};
+ if ($chr == '-' || $chr == '.' || ($chr >= '0' && $chr <= '9')) {
+ if (preg_match('/-?([0-9])*(\.[0-9]*)?((e|E)((-|\+)?)[0-9]+)?/s',
+ $str, $matches, PREG_OFFSET_CAPTURE, $start) && $matches[0][1] == $start) {
- $datum = $matches[0][0];
+ $datum = $matches[0][0];
- if (is_numeric($datum)) {
- if (preg_match('/^0\d+$/', $datum)) {
- throw new Zend_Json_Exception("Octal notation not supported by JSON (value: $datum)");
- } else {
- $val = intval($datum);
- $fVal = floatval($datum);
- $this->_tokenValue = ($val == $fVal ? $val : $fVal);
- }
- } else {
- throw new Zend_Json_Exception("Illegal number format: $datum");
- }
+ if (is_numeric($datum)) {
+ if (preg_match('/^0\d+$/', $datum)) {
+ throw new Zend_Json_Exception("Octal notation not supported by JSON (value: $datum)");
+ } else {
+ $val = intval($datum);
+ $fVal = floatval($datum);
+ $this->_tokenValue = ($val == $fVal ? $val : $fVal);
+ }
+ } else {
+ throw new Zend_Json_Exception("Illegal number format: $datum");
+ }
- $this->_token = self::DATUM;
- $this->_offset = $start + strlen($datum);
- }
- } else {
- throw new Zend_Json_Exception("Illegal Token at pos $i: $chr\nContext:\n--------------------------------------------------" . substr($str, $i) . "\n--------------------------------------------------");
- }
+ $this->_token = self::DATUM;
+ $this->_offset = $start + strlen($datum);
+ }
+ } else {
+ throw new Zend_Json_Exception("Illegal Token at pos $i: $chr\nContext:\n--------------------------------------------------" . substr($str, $i) . "\n--------------------------------------------------");
+ }
- return($this->_token);
- }
-
- /**
- * Handle a Unicode byte; local to Enano.
- * @param string 4 character byte sequence
- * @return string
- */
-
- protected function decode_unicode_byte($byte)
- {
- if ( strlen($byte) != 4 )
- throw new Zend_Json_Exception("Invalid Unicode sequence \\u$byte");
-
- $value = hexdec($byte);
+ return($this->_token);
+ }
+
+ /**
+ * Handle a Unicode byte; local to Enano.
+ * @param string 4 character byte sequence
+ * @return string
+ */
+
+ protected function decode_unicode_byte($byte)
+ {
+ if ( strlen($byte) != 4 )
+ throw new Zend_Json_Exception("Invalid Unicode sequence \\u$byte");
+
+ $value = hexdec($byte);
- if ($value < 0x0080)
- {
- // 1 byte: 0xxxxxxx
- $character = chr($value);
- }
- else if ($value < 0x0800)
- {
- // 2 bytes: 110xxxxx 10xxxxxx
- $character =
- chr((($value & 0x07c0) >> 6) | 0xc0)
- . chr(($value & 0x3f) | 0x80);
- }
- else
- {
- // 3 bytes: 1110xxxx 10xxxxxx 10xxxxxx
- $character =
- chr((($value & 0xf000) >> 12) | 0xe0)
- . chr((($value & 0x0fc0) >> 6) | 0x80)
- . chr(($value & 0x3f) | 0x80);
- }
-
- return $character;
- }
+ if ($value < 0x0080)
+ {
+ // 1 byte: 0xxxxxxx
+ $character = chr($value);
+ }
+ else if ($value < 0x0800)
+ {
+ // 2 bytes: 110xxxxx 10xxxxxx
+ $character =
+ chr((($value & 0x07c0) >> 6) | 0xc0)
+ . chr(($value & 0x3f) | 0x80);
+ }
+ else
+ {
+ // 3 bytes: 1110xxxx 10xxxxxx 10xxxxxx
+ $character =
+ chr((($value & 0xf000) >> 12) | 0xe0)
+ . chr((($value & 0x0fc0) >> 6) | 0x80)
+ . chr(($value & 0x3f) | 0x80);
+ }
+
+ return $character;
+ }
}
/**
@@ -995,62 +995,62 @@
*/
class Zend_Json
{
- /**
- * How objects should be encoded -- arrays or as StdClass. TYPE_ARRAY is 1
- * so that it is a boolean true value, allowing it to be used with
- * ext/json's functions.
- */
- const TYPE_ARRAY = 1;
- const TYPE_OBJECT = 0;
+ /**
+ * How objects should be encoded -- arrays or as StdClass. TYPE_ARRAY is 1
+ * so that it is a boolean true value, allowing it to be used with
+ * ext/json's functions.
+ */
+ const TYPE_ARRAY = 1;
+ const TYPE_OBJECT = 0;
- /**
- * @var bool
- */
- public static $useBuiltinEncoderDecoder = true;
+ /**
+ * @var bool
+ */
+ public static $useBuiltinEncoderDecoder = true;
- /**
- * Decodes the given $encodedValue string which is
- * encoded in the JSON format
- *
- * Uses ext/json's json_decode if available.
- *
- * @param string $encodedValue Encoded in JSON format
- * @param int $objectDecodeType Optional; flag indicating how to decode
- * objects. See {@link ZJsonDecoder::decode()} for details.
- * @return mixed
- */
- public static function decode($encodedValue, $objectDecodeType = Zend_Json::TYPE_ARRAY)
- {
- if (function_exists('json_decode') && self::$useBuiltinEncoderDecoder !== true) {
- return json_decode($encodedValue, $objectDecodeType);
- }
+ /**
+ * Decodes the given $encodedValue string which is
+ * encoded in the JSON format
+ *
+ * Uses ext/json's json_decode if available.
+ *
+ * @param string $encodedValue Encoded in JSON format
+ * @param int $objectDecodeType Optional; flag indicating how to decode
+ * objects. See {@link ZJsonDecoder::decode()} for details.
+ * @return mixed
+ */
+ public static function decode($encodedValue, $objectDecodeType = Zend_Json::TYPE_ARRAY)
+ {
+ if (function_exists('json_decode') && self::$useBuiltinEncoderDecoder !== true) {
+ return json_decode($encodedValue, $objectDecodeType);
+ }
- return Zend_Json_Decoder::decode($encodedValue, $objectDecodeType);
- }
+ return Zend_Json_Decoder::decode($encodedValue, $objectDecodeType);
+ }
- /**
- * Encode the mixed $valueToEncode into the JSON format
- *
- * Encodes using ext/json's json_encode() if available.
- *
- * NOTE: Object should not contain cycles; the JSON format
- * does not allow object reference.
- *
- * NOTE: Only public variables will be encoded
- *
- * @param mixed $valueToEncode
- * @param boolean $cycleCheck Optional; whether or not to check for object recursion; off by default
- * @return string JSON encoded object
- */
- public static function encode($valueToEncode, $cycleCheck = false)
- {
- if (function_exists('json_encode') && self::$useBuiltinEncoderDecoder !== true) {
- return json_encode($valueToEncode);
- }
+ /**
+ * Encode the mixed $valueToEncode into the JSON format
+ *
+ * Encodes using ext/json's json_encode() if available.
+ *
+ * NOTE: Object should not contain cycles; the JSON format
+ * does not allow object reference.
+ *
+ * NOTE: Only public variables will be encoded
+ *
+ * @param mixed $valueToEncode
+ * @param boolean $cycleCheck Optional; whether or not to check for object recursion; off by default
+ * @return string JSON encoded object
+ */
+ public static function encode($valueToEncode, $cycleCheck = false)
+ {
+ if (function_exists('json_encode') && self::$useBuiltinEncoderDecoder !== true) {
+ return json_encode($valueToEncode);
+ }
- return Zend_Json_Encoder::encode($valueToEncode, $cycleCheck);
- }
+ return Zend_Json_Encoder::encode($valueToEncode, $cycleCheck);
+ }
}
?>