使用perl返回json结构

时间:2015-11-05 07:50:42

标签: json perl

我在函数中有以下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"值?

4 个答案:

答案 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; 
}
相关问题