За последние 24 часа нас посетили 17656 программистов и 1595 роботов. Сейчас ищут 1617 программистов ...

Генерация JSON-строки

Тема в разделе "Решения, алгоритмы", создана пользователем [vs], 13 фев 2009.

  1. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Так сказать, проба пера в ООП =) Методом Add добавляем элементы (которые могут быть массивами), методом Get - получаем JSON-строку. Можно добавить элемент, получить строку, потом добавить еще элемент. Можно очистить буфер специально, методом Clear, и при получении JSON-строки. Вообщем, смотрите сами:
    Код (PHP):
    1. <?php
    2. /*            JSON AUTOGEN 1.0
    3.     Vasilii B. Shpilchin (c) 2009    
    4.             License: BSD            */
    5.  
    6. class JSON_AUTOGEN {
    7.     private $buffer = array();
    8.     private $result = null;
    9.     
    10.     /* Метод очистки буфера */
    11.     public function Clean () {
    12.         $this -> buffer = null;
    13.         $this -> result = null;
    14.     }
    15.     
    16.     /* Получение результата */
    17.     public function Get ($clean = false) { //Можно сразу и буфер очистить
    18.         $this -> compileJSON ($this -> buffer);
    19.         $result = '{' . $this -> result . '}';
    20.         if ($clean) $this -> Clean();
    21.         return $result;
    22.     }
    23.     
    24.     /* Добавление элемента */
    25.     public function Add ($key, $element=null) {
    26.         if (!$key) return false;
    27.         $this -> buffer[] = array('key'=>$key, 'value'=>$element);
    28.     }
    29.     
    30.     /* Компилируем JSON */
    31.     private function compileJSON ($array) {
    32.         $this -> result = null;
    33.         foreach ($array as $element) {
    34.             $key = addslashes($element['key']);
    35.             $value = $element['value'];
    36.             
    37.             if (is_array($value)) {
    38.                 $value = $this -> arrayToJSON($value);
    39.             } else {
    40.                 $value = '"' . addslashes($value) . '"';
    41.             }
    42.             
    43.             //Ключи ставить только если они определены
    44.             if ($key) {
    45.                 $tmp = '"' . $key .'":' . $value;
    46.             } else {
    47.                 $tmp = $value;
    48.             }
    49.             $tmp .= ',';
    50.             $this -> result .= $tmp;
    51.         }
    52.         
    53.         //После последнего элемента запятая не нужна
    54.         $this -> result = substr_replace($this -> result,null,strlen($this -> result)-1);
    55.     }
    56.     
    57.     /* Преобразование массива в JSON */
    58.     private function arrayToJSON ($array) {
    59.         $string = '[';
    60.         foreach ($array as $key => $value) {
    61.             
    62.             //Рекурсивная обработка
    63.             if (is_array($value)) {
    64.                 $string .= '"' . addslashes($key) . '":';
    65.                 $string .= $this -> arrayToJSON($value) . ']';
    66.             } else {
    67.                 $string .= '"' . addslashes($key) . '":"' . addslashes($value) . '"';
    68.                 $string .= ',';
    69.             }
    70.         }
    71.         $string = substr_replace($string,']',strlen($string)-1);
    72.         return $string;
    73.     }
    74. } //end class
    75. ?>
     
  2. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
  3. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Мдя %) Не думал, что моя версия PHP 5.1.5 настолько устарела =)
    Ну, эта функция заменяет обе приватные функции класса =) Зато класс пойдет на старых версиях =)
     
  4. Amian

    Amian Активный пользователь

    С нами с:
    15 мар 2007
    Сообщения:
    189
    Симпатии:
    0
    Код (Text):
    1. #     public function Clean () {
    2. #          $this -> buffer == null;
    3. #          $this -> result == null;
    4. #      }
    Что это? :lol: Если хочешь использовать нуль поинтер, то используй операцию присвоения, а не сравнения.

    И еще одно замечание - форматируй код в одном стиле, все названия переменных/методов начинаются с маленькой буквы, классы с большой, несколько слов в одном наименовании разделяются заглавными буквами , а не "_" и т.д. Самому приятней будет.

    А вообще велосипеды это круто, да :roll:
     
  5. akrinel

    akrinel Активный пользователь

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb
    Хе-Хе, я тоже пол дня убил на похожий велосипед, а потом гордо сообщил коллегам, что у нас теперь есть удобная функция для создания JSON.
    И в ответ получил ссылку на json_encode и ехидный смайлик :)))
     
  6. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Это еще раз доказывает то, что вне зависимости от опыта, нужно периодически пролистывать документацию.