decode_json并返回hash中的第一个键

时间:2017-12-21 00:23:44

标签: json perl

JSON字符串输入:https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=MSFT&apikey=demo

我试图只返回哈希中的第一个键(当前日期),但一直无法这样做。我的代码如下所示

#!/usr/bin/perl

use strict;
use warnings;
use LWP::Simple;
use Data::Dumper;
use JSON;

my $html = get("https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=AMD&apikey=CMDPTEHVYH7W5VSZ");

my $decoded = decode_json($html);
my ($open) = $decoded->{'Time Series (Daily)'}->[0]->{'1. open'};

我一直在"不是ARRAY参考"我研究过并且更加困惑。

我可以使用以下代码直接访问我想要的内容,但我只想访问第一个结果或当天:

my ($open) = $decoded->{'Time Series (Daily)'}{'2017-12-20'}{'1. open'};

如果我做这样的事情:

my ($open) = $decoded->{'Time Series (Daily)'};
print Dumper($open);

输出如下:

$VAR1 = {
      '2017-09-07' => {
                        '1. open' => '12.8400',
                        '5. volume' => '35467788',
                        '2. high' => '12.9400',
                        '4. close' => '12.6300',
                        '3. low' => '12.6000'
                      },
      '2017-11-15' => {
                        '3. low' => '10.7700',
                        '4. close' => '11.0700',
                        '2. high' => '11.1300',
                        '5. volume' => '33326871',
                        '1. open' => '11.0100'
                      },
      '2017-11-30' => {
                        '1. open' => '10.8700',
                        '2. high' => '11.0300',
                        '5. volume' => '43101899',
                        '3. low' => '10.7600',
                        '4. close' => '10.8900'
                      },

提前感谢您提供任何帮助,您可以提供菜鸟。

2 个答案:

答案 0 :(得分:4)

您正在选择hashref键,而不是数组(顺序容器)元素。所以你不能索引但需要根据需要对键进行排序,因为哈希本质上是无序的。

使用您显示的确切格式,这将起作用

my $top = (sort { $b cmp $a } keys %{ $decoded->{'Time Series (Daily)'} } )[0];
say $decoded->{'Time Series (Daily)'}{$top}{'1. open'};

获取键列表,对它们进行反序排序(按字母顺序排列),并获取该列表的第一个元素。

如果您的日期时间格式可能有所不同,那么您需要在排序之前解析它。

如果你真的只想要最新的一个,那么这个效率很低,因为它会对整个列表进行排序。

答案 1 :(得分:4)

问题1:{表示JSON对象的开始,该对象被解码为哈希。试图解散数组会失败。

问题2:像Perl哈希一样,JSON对象是无序的,所以谈论它 "第一把钥匙"没有意义。也许你想要最近的约会?

use List::Util qw( maxstr );

my $time_series_daily = $decoded->{'Time Series (Daily)'};
my $latest_date = maxstr @$time_series_daily;
my $open = $time_series_daily->{$latest_date}{'1. open'};