我有以下代码:

#!/opt/local/bin/perl

use strict;
use warnings;

use JSON::XS qw/decode_json/;

my $api_response = '{"user":{"id":14897,"data":["foo", "bar", "baz"]}}';
my $user = decode_json($api_response);
$user = $user->{user};

my @data = $user->{data};

print($user->{id}, "\n");  # output: 14897
print("@data", "\n");      # output: ARRAY(0x14200d9b8)
print($data[0], "\n");     # output: ARRAY(0x14200d9b8) why???
print($data[0][0], "\n");  # output: foo

这对我来说很好,但我花了一段时间才弄清楚,我必须深入到$data的2个级别,在我看来,这应该代表一个简单的字符串array.这是预期行为,还是我的代码有问题?

推荐答案

标量(如散列元素)不能是数组或散列.但是我们可以在其中存储对数组、散列和散列的引用.这里就是这种情况.

my @data = $user->{data};

say "@data";
say $data[0];

应该是

my $data = $user->{data};

say "$data->@*";     # Or `say @{ $data };`    or `say @$data;`
say $data->[0];      # Or `say ${ $data }[0];` or `say $$data[0];`

看到Perl Dereferencing Syntax

Json相关问答推荐

Jolt变换将字段移动到数组的每个元素中

来自json的可分析的构建报告

在Jolt中将具有嵌套元素的对象数组转换为单独的对象列表

使用JQ合并JSON列表中的对象

解析Ansible AWS ec2_security_group中的json以提取安全组ID

如何使用 JOLT 使用输入数组中的值和层次 struct 中的其他字段创建数组

PostgreSQL:删除 JSONB 数组中每个元素的特定键

(已回答)JSON 读取函数返回未定义而不是预期值 - Typescript

JOLT转换并向输出添加新数组

如何修复通过在 tsconfig.json 文件中添加allowImportingTsExtensions引发的错误 TS5023?

是否可以在有条件的情况下将 json 对象转换为 JOLT 中的数组?

坚持弄清楚如何使用 api 响应来调用以从不同的链接检索响应

N1QL 搜索对象内的某些对象

如何使用 gson 调用默认反序列化

将 JSON 读取到 pandas 数据框 - ValueError:将 dicts 与非系列混合可能会导致排序不明确

Android 上的 JSON - 序列化

Rails 中奇怪的 JSON Javascript 问题

没有默认构造函数的杰克逊第 3 方类

在 JSON.NET 中序列化派生类时的字段顺序

如何在 React js 中解析本地 JSON 文件?