我的JSON文件包含大约3000行内容,如下所示:
{
"product": [
{
"data": [
{
"number":"111",
"price":"3170",
"stock":"1"
},
{
"number":"222",
"price":"3170",
"stock":"1"
},
{
"number":"333",
"price":"3749",
"stock":"1"
}
],
"object":"apple",
"id":"54529"
},
{
"data":[],
"object":"orange",
"id":"54524"
}
]
}
我需要非常快速地解析它们。
以下是我的代码。它不起作用..
use strict;
use warnings;
use JSON qw( );
my $filename = 'mob.json';
my $json_text = do
{
open(my $json_fh, "<:encoding(UTF-8)", $filename);
local $/;
<$json_fh>
};
my $json = JSON->new;
my $data = $json->decode($json_text);
for ( @{$data->{'product'}} )
{
print $_->{data}[0]->{number};
}
我还需要获得number
,price
,stock
和object
,id
。
答案 0 :(得分:3)
您的代码运行正常。几乎。我做了一些调整。
你提到开始时的速度。不清楚你是否想要快速回答,或者更快速地解析大量信息。如果是前者,请继续阅读。如果是后者,请确保安装了JSON :: XS。
风格方面我觉得看起来很痛苦。
do{}
来阅读文件让我想要伤害自己。但是,你使用了3-param open。奖励。此代码解析您的JSON并将其输出,并使用&#39; undefined&#39;
替换空值use strict;
use warnings;
use JSON qw( );
my $filename = 'mob.json';
my $json_text = do {
open(my $json_fh, "<:encoding(UTF-8)", $filename);
local $/;
<$json_fh>;
};
my $json = JSON->new()->utf8(1);
my $data = $json->decode($json_text);
for my $product ( @{$data->{'product'}} ){
my ($name, $id) = map { $product->{$_} // 'undefined' } qw(name id);
print sprintf("Product: %s (%s)\n", $name, $id);
foreach my $data ( @{$product->{'data'}} ) {
my ($number, $price, $stock) =
map { $data->{$_}//'undefined' } qw(number price stock);
print sprintf(
" number: %s, price: %s, stock: %s\n",
$number,
$price,
$stock,
);
}
print "\n";
}