Сегодня наваял вот такое: PHP: <?php class JSONHelper { var $match = array('"', '\\', '/', "\n", "\r"); var $replace = array('\"', '\\\\', '\/', '\\n', '\\r'); /** * Parse structure to JSON * * @param mixed $data * @return string */ function parse($data) { return '{'.$this->encode($data).'}'; } /** * Converts PHP variable to JSON string * Can convert any PHP variable with any content to correct JSON structure * * @param mixed $data Data to convert * @return string */ function encode($data) { $type = $this->getType($data); switch ($type) { case 'object': $data = '{'.$this->processData($data, $type).'}'; break; case 'array': $data = '['.$this->processData($data, $type).']'; break; case 'number': $data = $data; break; case 'string': $data = '"'.$this->escape($data).'"'; break; case 'boolean': $data = ($data) ? 'true' : 'false'; break; case 'null': $data = 'null'; break; } return $data; } //----------------------------------------------------------------------------- /** * Enter description here... * * @param unknown_type $input * @param unknown_type $type * @return unknown */ function processData($data, $type) { // If data is an object - it should be converted as a key => value pair if ($type == 'object' || $type == 'array'){ $output = Array(); foreach($data as $key => $value) { $output[] = '"'.$key.'": '.$this->encode($value); } $output = implode(',', $output); } else { $output = null; foreach($data as $key => $value) { $output .= $this->encode($value); } } return $output; } //----------------------------------------------------------------------------- /** * Function determines type of variable * * @param unknown_type $data * @return unknown */ function getType(&$data){ if (is_object($data)) { $type = 'object'; } elseif (is_array($data)) { // If array is assoc it should be processed as an object if($this->is_assoc($data)) { $type = 'object'; } else { $type = 'array'; } } elseif (is_numeric($data)) { $type = 'number'; } elseif(is_string($data)) { $type = 'string'; } elseif(is_bool($data)) { $type = 'boolean'; } elseif(is_null($data)) { $type = 'null'; } else { $type = 'string'; } return $type; } //----------------------------------------------------------------------------- /** * Function determines if array is associative * * @param array $array * @return bool * @ */ function is_assoc($array) { // We do that by sorting array keys in reverse (numbers go before other symbols) // and probing first element key. 99.9% it will be a string key. krsort($array, SORT_STRING); return !is_numeric(key($array)); } //----------------------------------------------------------------------------- /** * Escapes special characters * Function escapes ", \, /, \n and \r symbols so that not to cause JavaScript error or * data loss * * @param string $string * @return string */ function escape($string) { return str_replace($this->match, $this->replace, $string); } //----------------------------------------------------------------------------- } ?> Однако есть проблема - покрайней мере Firefox в Firebug ругается "missing ]", хотя вроде всё правильно же. Использую вот так: PHP: <?php $data = Array( "103"=> Array( "AcademicPlanItemId"=> "103", "WeekContactHours"=> "4", "IsJointLecture"=> "0", "RefStudyId"=> "9", "RefStudyTitle"=> "Testing", "Staff"=> Array( "22"=> Array( "StaffId"=> "22", "StaffName"=> "Sidor Sidorov", ), ), ), "100"=> Array( "AcademicPlanItemId"=> "100", "WeekContactHours"=> "13", "IsJointLecture"=> "0", "RefStudyId"=> "2", "RefStudyTitle"=> "Какая-то фигня", "Staff"=> Array( "22"=> Array( "StaffId"=> "22", "StaffName"=> "Sidor Sidorov", ), "3"=> Array( "StaffId"=> "3", "StaffName"=> "Vasilij Pupkin", ), "23"=> Array( "StaffId"=> "23", "StaffName"=> "Nikolaj Mutkin", ), ), ), "102"=> Array( "AcademicPlanItemId"=> "102", "WeekContactHours"=> "12", "IsJointLecture"=> "0", "RefStudyId"=> "1", "RefStudyTitle"=> "Дисциплина 1", "Staff"=> Array( "3"=> Array( "StaffId"=> "3", "StaffName"=> "Vasilij Pupkin", ), ), ), ); $json = new JSONHelper(); echo $json->parse($data); Визуально всё ОК, но Firebug ругается и данных и в итоге код [js] data = eval(req.responceText); [/js] не выполняется и data остаётся undefined Мучался пол дня почти, так и не догнал в чём проблема
Насколько я понимаю, массивы выводятся в результате примерно в таком виде: Такая форма записи неверна. Надо либо так: Код (Text): "array": [0,1,2] Либо, если надо сохранять значения ключей, то вместо квадратных скобок надо все равно использовать фигурные - тогда будет создан хеш (хешем в javascript называется то, что в php зовется ассоциативный массив)
Services_JSON Класс работы с JSON данными в PHP < 5.2 http://codepaste.ru/1018/ Sergey89, спасибо за удобный сервис.
Taris, не хочу показаться назойливым но специально для таких случаев сделал небольшой сервис (вторая ссылка в подписи).
Ti Тем что PEAR, а у нас собственная модель приложения. На самом деле этот класс делает extend другого базового класса, я просто это опустил. P.S. Вместо сериализованного масива выложил нормальный объявленный через Array()