2015-11-05 2 views
0

У меня есть следующий SQL заявление внутри функции ..возвращение структуры JSON с помощью Perl

my $sth = $dbh->prepare(qq[SELECT device_uuid,device_name FROM ].DB_SCHEMA().qq[.user_device WHERE user_id = ?]); 
$sth->execute($user_id) || die $dbh->errstr; 

результатов они загружаются с помощью следующего оператора

while(my $data = $sth->fetchrow_arrayref()) { 

} 

мой вопрос, как я могу создать и вернуть структуру json, содержащую объекты для каждой строки, которая была выбрана?

{ 
object1:{ 
    "device_uuid1":"id1", 
    "device_name1":"name1" 
    }, 
object2:{ 
    "device_uuid2":"id2", 
    "device_name2":"name2" 
    }, 
object3:{ 
    "device_uuid3":"id3", 
    "device_name3":"name3" 
    } 
} 

общее количество json-объектов будет равно количеству строк, возвращаемых оператором sql. я сумел построить структуру, подобных этой

$VAR1 = [{"device_name":"device1","device_id":"device_id1"},{"device_name":"device2","device_id":"device_id2"}] 

как могу я перебирать реф массива и получить «имя_устройство» и значение «device_id»?

+0

Посмотрите на [JSON] (https://metacpan.org/pod/JSON) модуля , – blm

+1

FYI, который вы правильно хотите вывести: '[{...}, {...}, {...}]' <- массив с объектами (хэши) – andlrc

+0

да точно .... – tsiro

ответ

0

Для ваших нужд библиотека this должна хорошо работать. Что вам нужно сделать, это иметь скалярную переменный, определенные как показано ниже и нажмите элемент для каждой итерации в то время как петля

my $json = JSON->new->utf8->space_after->encode({}) 

while(my $data = $sth->fetchrow_arrayref()) { 
    #Push new element here in $json using incr_parse method 
    #or using $json_text = $json->encode($perl_scalar) 
} 

Надеется, что это помогает.

+0

Вы можете более подробно объяснить, что мне делать? – tsiro

0

наконец, что я сделал, чтобы создать реф массив и раздвинуть выбранные строки, которые в настоящее время возвращаются в виде хэша-рефов

my @device =(); 
while(my $data = $sth->fetchrow_hashref()) { 
     push(@device, $data); 
} 

последнего я преобразовать реф @device массива в JSON и возвращать результат

return encode_json(\@device); 
+0

Зачем вызывать 'fetchrow_hashref()' несколько раз, когда 'fetchall_arrayref()' будет делать то, что вы хотите в одном вызове? –

0

Метод дескриптора оператора fetchall_arrayref() может возвращать ссылку на массив, где каждый элемент в ссылочном массиве является хеш-ссылкой, содержащей детали одной строки в наборе результатов. Мне кажется, что это именно та структура данных, которую вы хотите. Таким образом, вы можете просто вызвать этот метод и передать возвращенную структуру данных функции JSON-кодирования.

# Passing a hash ref to fetchall_arrayref() tells it to 
# return each row as a hash reference. 
my $json = encode_json($sth->fetchall_arrayref({}); 
0

Ваш образец JSON неверен - JSON на самом деле очень хорошо представлены PERL структуры данных - [] обозначает массив, {} обозначает ключ-значение (очень похожий на хэш).

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

Почему? хорошо, так что вы можете сделать что-то вроде этого:

print $my_data{$_}->{'name'} for keys %my_data; 

Гораздо лучше пойти на что-то вроде:

#!/usr/bin/env perl 

use strict; 
use warnings; 
use Data::Dumper; 

use JSON; 

my %my_data = (
     object1 => { 
      uuid => "id1", 
      name => "name1" 
     }, 
     object2 => { 
      uuid => "id2", 
      name => "name2" 
     }, 
     object3 => { 
      uuid => "id3", 
      name => "name3" 
     }, 
); 

print Dumper \%my_data; 
print to_json (\%my_data, { 'pretty' => 1 })."\n"; 

Теперь, это считать, что вы «Object1» является уникальным ключом - если он ISN» т, вы можете вместо этого сделать что-то вроде этого - массив анонимных хэшей (для бонусных баллов, он сохраняет упорядоченность)

my @my_data = (
    { object1 => { 
      uuid => "id1", 
      name => "name1" 
     } 
    }, 
    { object2 => { 
      uuid => "id2", 
      name => "name2" 
     } 
    }, 
    { object3 => { 
      uuid => "id3", 
      name => "name3" 
     } 
    }, 
); 

Теперь, как взять ваш пример и продлить его?Easy Peasy действительно - собрать то, что вы хотите добавить в свою структуру в цикле, и вставить его в структуру:

while(my $data = $sth->fetchrow_arrayref()) { 
    my $objectname = $data -> [0]; #assuming it's this element! 
    my $uuid = $data -> [1]; 
    my $name = $data -> [2]; 
    my $new_hash = { uuid => $uuid, name => $name }; 
    $mydata{$objectname} = $new_hash; 
} 
Смежные вопросы