perl fast json解析器程序

时间:2015-02-26 14:05:28

标签: json performance perl

我的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};
}

我还需要获得numberpricestockobjectid

1 个答案:

答案 0 :(得分:3)

您的代码运行正常。几乎。我做了一些调整。

你提到开始时的速度。不清楚你是否想要快速回答,或者更快速地解析大量信息。如果是前者,请继续阅读。如果是后者,请确保安装了JSON :: XS。

风格方面我觉得看起来很痛苦。

  1. 使用do{}来阅读文件让我想要伤害自己。但是,你使用了3-param open。奖励。
  2. 您需要从散列
  3. 中提取数组值
  4. 您需要处理数据中的空值,否则您将不断收到警告
  5. 此代码解析您的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";
    }