Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Вариант конвертора JsHttpRequest::php2js не оборачивающий числа в кавычки (Denis Usenko)
Author Message
Denis Usenko
Участник форума



Joined: 06 Feb 2006
Posts: 54
Карма: 13
   поощрить/наказать


PostPosted: Sat Jul 12, 2008 3:04 am (написано за 13 минут 52 секунды)
   Post subject: Вариант конвертора JsHttpRequest::php2js не оборачивающий числа в кавычки
Reply with quote

По следам соседней темы (forum.dklab.ru/js/jshttprequest/NeKorrektnoeFormirovanieJson-obekta.html?added=yes)
вариант конвертора JsHttpRequest::php2js не оборачивающий числа в кавычки.
Прочие отличия:
Изменен способ "прослешивания" строк, теперь прослешиваются последовательности \b и \f, (в оригинальной функе это не работало). Я не вижу в этом особого смысла, но json.org/ это требует.
Функа в целом немного изменена, хочется надеятся, что будет быстрее. Из за использования array_key_exists минимальная версия php: 4.0.7.
Code (php): скопировать код в буфер обмена
    function php2js($a=false)
    {
        // JSON escape sequence (http://json.org/)
        //  "    \x22    quotation mark
        //  \    \x5C    revers solidus
        //  /    \x2F    solidus
        //  \b   \x08    backspace
        //  \f   \x0C    formfeed
        //  \n   \x0A    newline
        //  \r   \x0D    carriage return
        //  \t   \x09    horizontal tab
        //  \u   \uNNNN  four hexadecimal digits (is not supported)

        static (www.php.net/static) $escape = "\"\\\/\x08\x0C\n\r\x09";

        // PHP types:
        //  boolean     (since PHP 4)
        //  integer
        //  double      (for historical reasons "double" is returned in case of a float, and not simply "float")
        //  string
        //  array
        //  object
        //  resource    (since PHP 4)
        //  NULL        (since PHP 4)

        switch (gettype (www.php.net/gettype)($a)) {
            case 'NULL'   : return 'null';
            case 'boolean': return $a ? 'true' : 'false';
            case 'integer': return (int) $a;
            case 'double' :
            case 'float'  : return (real) $a;
            case 'string' : return '"' . addcslashes (www.php.net/addcslashes)($a, $escape) . '"';
            case 'object' :
            case 'array'  :

            $result = array (www.php.net/array)();
            $i = count (www.php.net/count)($a);

            while($i-- && array_key_exists (www.php.net/array_key_exists)($i, $a)); // array_key_exists since PHP 4.0.7

            if( $i < 0 ){
                foreach ($a as $v)
                    $result[] = JsHttpRequest::php2js($v);
                return '[' . join (www.php.net/join)(',', $result) . ']';
            } else {
                foreach ($a as $k => $v)
                    $result[] = '"'. $k . '":' . JsHttpRequest::php2js($v);
                return '{' . join (www.php.net/join)(',', $result) . '}';
            }
        }
    }
И, на всякий пожарный, js-функа для отладочного вывода с отступами json-хеша:
Code (JavaScript): скопировать код в буфер обмена
String.prototype.x = function(n){ return Array(n > 0 ? n + 1 : 0).join(this) };

function viewHash(value, indent){

    var depth = 0, output = [];
    indent = indent || "    ";
    printhash = function (v){

        if( v instanceof Array ){
            depth++; output.push('[\n');
            for(var i = 0, l = v.length; i < l; i++){
                printhash(indent.x(depth) + v[i]);
            }
            output.push(indent.x(--depth) + '],\n');
            return
        }
        if( v instanceof Object ){
            depth++; output.push('{\n');
            for(var k in v){
                output.push(indent.x(depth) + '"'+ k + '": ');
                printhash(v[k]);
            }
            output.push(indent.x(--depth) + '}\n');
            return
        }
        output.push(v + ',\n')
    }
    printhash(value);
    return output.join('')
}
Использовать примерно так:
Code (JavaScript): скопировать код в буфер обмена
document.getElementsByTagName('pre')[0].innerHTML = viewHash(req.responseJS);
Функа не различает тип значений, чтобы посмотреть, что и как передается проще глянуть в firebug.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
Post a reply
Username
Subject
Господа спамеры и оптимизаторы!

Вы можете даже и не пытаться вставлять в текст поста ссылки - они все равно автоматически удаляются (вернее, тэги <a> заменяются на тэги <u>).

Но если не поверите и все же попытаетесь - как только увидите, что все безрезультатно, удалите свой пост, пожалуйста. Модераторы тоже люди, нехорошо, если они погрязнут в тоннах спама.
     

Disable BBCode in this post
Disable Smilies in this post
    HTML is OFF
BBCode is ON
Smilies are ON
You cannot post new topics in this forum. You can reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML