【问题标题】:looping through json in perl在perl中循环遍历json
【发布时间】:2021-03-20 23:36:03
【问题描述】:

我正在尝试从 Ping 的 json 导出中获取一些信息。我生锈的 Perl 技能让我失望了,因为我在取消引用的杂草中迷失了方向。与其把我的头撞到墙上,我想我会发布一个问题,因为所有的谷歌搜索都在这里领先。

我的理解是decode_json 将项目转换为哈希数组,每个哈希都有字符串和其他一些哈希数组作为内容。这似乎在尝试获取单个字符串值时得到证实,但前提是我手动指定了特定的数组元素。我不知道如何循环遍历这些项目。

JSON 像这样返回:

{
  "items":[
     {
       #lots of values here are some examples
       "type": "SP",
       "contactInfo": {
          "company": "Acme",
          "email": "john.doe@acme.com"
     }
 ]
}

获取实际值没有问题

#!/usr/bin/perl
use JSON;
use Data::Dumper;
use strict;
use warnings;
use LWP::Simple;


my $json;
{
  local $/; #Enable 'slurp' mode
  open my $fh, "<", "idp.json";
  $json = <$fh>;
  close $fh;
}

my $data = decode_json($json);

#array print $data->{'items'};
#hash print $data->{'items'}->[0];
#print $data->{'items'}->[0]->{'type'};

但是,我不知道如何遍历项目数组。我尝试了forforeach 以及各种取消引用组合,它一直告诉我我循环的值仍然是一个数组。如果$data-&gt;{'items'} 是一个数组,那么大概我应该能够做一些变化

foreach my $item ($data->{'items'})  

my @items = $data->{'items'};

for (@items)
{
  # stuff
}

但是,我不断返回数组,我必须添加 ->[0] 才能获得特定值。

【问题讨论】:

  • 请记住,Perl 数据结构和 JSON 几乎相同。它非常便携。

标签: json perl


【解决方案1】:

$data-&gt;{'items'} 是对数组(散列引用)的引用。你需要取消引用它,@{ }:

use JSON;
use strict;
use warnings;

my $json;
{
  local $/; #Enable 'slurp' mode
  $json = <DATA>;
}

my $data = decode_json($json);
for my $item (@{ $data->{items} }) {
    print "$item->{type}\n";
}

__DATA__
{
  "items":[
     {
       "type": "SP",
       "contactInfo": {
          "company": "Acme",
          "email": "john.doe@acme.com"
        }
     }
 ]
}

输出:

SP

【讨论】:

  • 谢谢!我知道它必须是非常明显的东西,但出于某种原因,当我打印出来时,我想如果它是参考而不是 ARRAY,它会说 ARRAYREF。不知道我为什么这么想。
猜你喜欢
  • 1970-01-01
  • 2016-08-20
  • 2021-12-06
  • 2013-12-11
  • 2018-06-19
  • 2012-07-20
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多