decode_json并返回hash中的第一个键

问题描述 投票:1回答:2

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'
                      },

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

json perl
2个回答
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'};

4
投票

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

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.