【问题标题】:return json structure using perl使用 perl 返回 json 结构
【发布时间】:2016-02-05 23:13:11
【问题描述】:

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

如何遍历数组 refs 并获取“device_name”和“device_id”值?

【问题讨论】:

  • 查看JSON模块。
  • 仅供参考,您想正确地输出:[{...},{...},{...}]
  • dev-null 我如何遍历你建议的结构?

标签: json perl


【解决方案1】:

根据您的需要,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)
}

希望对你有所帮助。

【讨论】:

  • 你能详细解释一下我应该怎么做吗?
【解决方案2】:

最后我所做的是创建一个数组引用并推送作为哈希引用返回的获取的行

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

最后我将@device 数组 ref 转换为 json 并返回结果

return encode_json(\@device);

【讨论】:

  • 为什么要多次调用fetchrow_hashref(),而fetchall_arrayref() 会在一次调用中完成您想要的操作?
【解决方案3】:

语句句柄方法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({});

【讨论】:

    【解决方案4】:

    您的示例 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' 是唯一键 - 如果不是,您可以改为执行类似的操作 - 匿名哈希数组(对于奖励积分,它保留排序)

    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; 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-01
      • 2020-11-05
      • 2020-04-02
      • 1970-01-01
      • 2016-02-04
      • 2021-01-05
      • 2023-03-10
      • 2015-02-25
      相关资源
      最近更新 更多