LINUX.ORG.RU

Нужен многомерный JSON, составленный динамически

 , ,


0

2

Подскажите, комрады!

Нужно передать на сервер json, часть которого я хочу составить динамически. На сервере - perl и Mojolicious.

Делаю:

var params = {
   'id':$(this).attr('data-id'),
   'row-data':{}
};

params['row-data'] я потом заполняю в цикле (ассоциативный массив). Но вся беда в том, что когда я посылаю это все ajax-ом на сервер, то либо параметр row-data вообще не распарсивается, либо распарсивается строкой, если я сделаю над ним какой-нибудь $.toJSON или JSON.stringify. А мне бы хотелось получить обычный хеш. Т.е. почему-то не получается второго уровня у хеша.

Это как-то возможно побороть? На клиенте или только на сервере делать ручной парсинг json из строки params['row-data'] (очень бы не хотелось)?

★★★★★

так может нужно вывести на консольку params и посмотреть, валидный ли там json или нет?

x0r ★★★★★
()
Ответ на: комментарий от x0r

если я делаю без всяких JSON.stringify, то получаю вот такую php-шную структуру:

$VAR1 = {
          'params' => bless( {
                               'params' => [
                                             'id',
                                             '1',
                                             'row-data[comment_id]',
                                             'test_comment_url',
                                             'row-data[id]',
                                             '1',
                                             'row-data[name_id]',
                                             'test_name_id',
                                             'row-data[picture_url]',
                                             'test_pic_url',
                                             'row-data[rarity]',
                                             '1',
                                             'row-data[type_name_id]',
                                             'test_type_is'
                                           ],
                               'charset' => 'UTF-8'
                             }, 'Mojo::Parameters' ),
          'row-data' => undef
        };

bvn13 ★★★★★
() автор топика

Что использовал для парсинга на сервере? JSON::XS, Mojo::JSON? Опять же say $self->dumper($self->param('...')) было бы приятно посмотреть.

bug
()

ЯННП

Покажи как заполняешь и отправляешь.

Kalashnikov ★★★
()
Ответ на: комментарий от bug

вот именно, что хотелось бы ничего не использовать. Хотелось простого

my $rowData = $self->req->param('row-data');
и чтобы сразу получить хеш. Но, видимо, это невозможно.

Сделал через JSON.stringify всего params (на клиенте) и последующего Mojo::JSON->decode($self->req->body) с предварительным Encode::encode('UTF-8', $self->req->body) по совету вики.

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от bvn13

'row-data' => undef

ну правильно, у тебя же объект не определен

php-шную структуру:

php-шную? точно?

потому что в пхп у json_decode есть параметр, управляющий парсингом '{...}': в виде хеша либо в виде объекта.

linuxnewb
()
Ответ на: комментарий от linuxnewb

php-шную структуру:

php-шную? точно?

точно. Я только в нем видел передачу параметров-массивов как

"row-data[comment_id]"

bvn13 ★★★★★
() автор топика

У меня с JSON никаких проблем. Тоже Mojo и Perl. Может покажешь сорцы? Так будет проще, так и не понял в чем у тебя проблема.

outtaspace ★★★
()
Ответ на: комментарий от bvn13

точно. Я только в нем видел передачу параметров-массивов как

Фигово тебе. Это не php'шная приблуда, а html'ная.

bug
()
Ответ на: комментарий от outtaspace

шаблон

        $('.<%=$btnSave%>').each(function(){
            $(this).click(function(){

                var params = {
                    'id': $(this).attr('data-id'),
                    'row-data': {}
                };

                $('input[data-row='+$(this).attr('data-id')+']').each(function(){
                    params['row-data'][$(this).attr('data-col')] = $(this).val();
                });

                $.post('/db_view/save/<%= $t->{schema} %>/<%= $t->{table} %>.json', params)
                .done(function(){
                    alert('successfully saved');})
                .fail(function(){
                    alert('failed');});
            });
        });
    });

контроллер

sub save {
    my $self = shift;
    my ($action, $schema, $tname) = (
        $self->stash('action'),
        $self->stash('schema'),
        $self->stash('table')
    );

    # вот так хотелось бы работать, но нет
    my $rowData = $self->req->param('row-data');
}

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от bug

он про то, что в пхп разбор таких параметров «изкоробки»

linuxnewb
()
Ответ на: комментарий от bvn13

Он так и так в текст преобразуется, либо прозрачно для тебя, либо нет.

linuxnewb
()
Ответ на: комментарий от bvn13

а все потому, что на http://mojolicio.us доки запутанные

Смотрю доки на CPAN. Там есть удобная фича - ссылка на исходный код модуля.

outtaspace ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.