我在函数中有以下sql语句..
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_name"和" device_id"值?
答案 0 :(得分:0)
根据您的需要,this图书馆应该运作良好。你需要做的是有一个如下定义的标量变量,并在while循环中推送每次迭代的元素
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)
}
希望这会对你有所帮助。
答案 1 :(得分:0)
最后我做的是创建一个数组引用并推送作为哈希引用返回的获取行
my @device = ();
while(my $data = $sth->fetchrow_hashref()) {
push(@device, $data);
}
最后我将@device数组ref转换为json并返回结果
return encode_json(\@device);
答案 2 :(得分: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({});
答案 3 :(得分: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";
现在,这确实假设你的对象1'是一个独特的密钥 - 如果它不是,你可以改为做这样的事情 - 一系列匿名哈希(对于奖励积分,它保留了订购)
my @my_data = (
{ object1 => {
uuid => "id1",
name => "name1"
}
},
{ object2 => {
uuid => "id2",
name => "name2"
}
},
{ object3 => {
uuid => "id3",
name => "name3"
}
},
);
现在,如何举例并扩展它?真的很容易 - 在你的循环中组装你想要添加到你的结构中的东西,然后将它插入到结构中:
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;
}