00001 <?php
00027 require_once 'Zend/Json/Expr.php';
00028
00029
00039 class Zend_Json
00040 {
00046 const TYPE_ARRAY = 1;
00047 const TYPE_OBJECT = 0;
00048
00054 public static $maxRecursionDepthAllowed=25;
00055
00059 public static $useBuiltinEncoderDecoder = false;
00060
00072 public static function decode($encodedValue, $objectDecodeType = Zend_Json::TYPE_ARRAY)
00073 {
00074 if (function_exists('json_decode') && self::$useBuiltinEncoderDecoder !== true) {
00075 return json_decode($encodedValue, $objectDecodeType);
00076 }
00077
00078 require_once 'Zend/Json/Decoder.php';
00079 return Zend_Json_Decoder::decode($encodedValue, $objectDecodeType);
00080 }
00081
00102 public static function encode($valueToEncode, $cycleCheck = false, $options = array())
00103 {
00104 if (is_object($valueToEncode) && method_exists($valueToEncode, 'toJson')) {
00105 return $valueToEncode->toJson();
00106 }
00107
00108
00109 $javascriptExpressions = array();
00110 if(isset($options['enableJsonExprFinder'])
00111 && ($options['enableJsonExprFinder'] == true)
00112 ) {
00116 require_once "Zend/Json/Encoder.php";
00117 $valueToEncode = self::_recursiveJsonExprFinder($valueToEncode, $javascriptExpressions);
00118 }
00119
00120
00121 if (function_exists('json_encode') && self::$useBuiltinEncoderDecoder !== true) {
00122 $encodedResult = json_encode($valueToEncode);
00123 } else {
00124 require_once 'Zend/Json/Encoder.php';
00125 $encodedResult = Zend_Json_Encoder::encode($valueToEncode, $cycleCheck, $options);
00126 }
00127
00128
00129 if (count($javascriptExpressions) > 0) {
00130 $count = count($javascriptExpressions);
00131 for($i = 0; $i < $count; $i++) {
00132 $magicKey = $javascriptExpressions[$i]['magicKey'];
00133 $value = $javascriptExpressions[$i]['value'];
00134
00135 $encodedResult = str_replace(
00136
00137 '"' . $magicKey . '"',
00138 $value,
00139 $encodedResult
00140 );
00141 }
00142 }
00143
00144 return $encodedResult;
00145 }
00146
00161 protected static function _recursiveJsonExprFinder(
00162 &$value, array &$javascriptExpressions, $currentKey = null
00163 ) {
00164 if ($value instanceof Zend_Json_Expr) {
00165
00166 $magicKey = "____" . $currentKey . "_" . (count($javascriptExpressions));
00167 $javascriptExpressions[] = array(
00168
00169
00170 "magicKey" => (is_int($currentKey)) ? $magicKey : Zend_Json_Encoder::encodeUnicodeString($magicKey),
00171 "value" => $value->__toString(),
00172 );
00173 $value = $magicKey;
00174 } elseif (is_array($value)) {
00175 foreach ($value as $k => $v) {
00176 $value[$k] = self::_recursiveJsonExprFinder($value[$k], $javascriptExpressions, $k);
00177 }
00178 } elseif (is_object($value)) {
00179 foreach ($value as $k => $v) {
00180 $value->$k = self::_recursiveJsonExprFinder($value->$k, $javascriptExpressions, $k);
00181 }
00182 }
00183 return $value;
00184 }
00185
00212 public static function fromXml ($xmlStringContents, $ignoreXmlAttributes=true) {
00213
00214 $simpleXmlElementObject = simplexml_load_string($xmlStringContents);
00215
00216
00217 if ($simpleXmlElementObject == null) {
00218 require_once 'Zend/Json/Exception.php';
00219 throw new Zend_Json_Exception('Function fromXml was called with an invalid XML formatted string.');
00220 }
00221
00222 $resultArray = null;
00223
00224
00225 $resultArray = self::_processXml($simpleXmlElementObject, $ignoreXmlAttributes);
00226
00227
00228
00229 $jsonStringOutput = self::encode($resultArray);
00230 return($jsonStringOutput);
00231 }
00232
00258 protected static function _processXml ($simpleXmlElementObject, $ignoreXmlAttributes, $recursionDepth=0) {
00259
00260 if ($recursionDepth > self::$maxRecursionDepthAllowed) {
00261
00262 require_once 'Zend/Json/Exception.php';
00263 throw new Zend_Json_Exception(
00264 "Function _processXml exceeded the allowed recursion depth of " .
00265 self::$maxRecursionDepthAllowed);
00266 }
00267
00268 if ($recursionDepth == 0) {
00269
00270
00271 $callerProvidedSimpleXmlElementObject = $simpleXmlElementObject;
00272 }
00273
00274 if ($simpleXmlElementObject instanceof SimpleXMLElement) {
00275
00276 $copyOfSimpleXmlElementObject = $simpleXmlElementObject;
00277
00278 $simpleXmlElementObject = get_object_vars($simpleXmlElementObject);
00279 }
00280
00281
00282 if (is_array($simpleXmlElementObject)) {
00283
00284 $resultArray = array();
00285
00286 if (count($simpleXmlElementObject) <= 0) {
00287
00288
00289 return (trim(strval($copyOfSimpleXmlElementObject)));
00290 }
00291
00292
00293 foreach($simpleXmlElementObject as $key=>$value) {
00294
00295
00296
00297 if(($ignoreXmlAttributes == true) && (is_string($key)) && ($key == "@attributes")) {
00298 continue;
00299 }
00300
00301
00302
00303 $recursionDepth++;
00304 $resultArray[$key] = self::_processXml ($value, $ignoreXmlAttributes, $recursionDepth);
00305
00306
00307 $recursionDepth--;
00308 }
00309
00310 if ($recursionDepth == 0) {
00311
00312
00313
00314
00315 $tempArray = $resultArray;
00316 $resultArray = array();
00317 $resultArray[$callerProvidedSimpleXmlElementObject->getName()] = $tempArray;
00318 }
00319
00320 return($resultArray);
00321 } else {
00322
00323
00324
00325
00326
00327
00328 $pattern = '/^[\s]*new Zend_Json_Expr[\s]*\([\s]*[\"\']{1}(.*)[\"\']{1}[\s]*\)[\s]*$/';
00329 $matchings = array();
00330 $match = preg_match ($pattern, $simpleXmlElementObject, $matchings);
00331 if ($match) {
00332 return new Zend_Json_Expr($matchings[1]);
00333 } else {
00334 return (trim(strval($simpleXmlElementObject)));
00335 }
00336
00337 }
00338 }
00339 }