2015-02-26 5 views
1

Мой JSON-файл содержит около 3000 строк контента, как показано ниже:Perl быстро JSON программа парсер

{ 
    "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

Существует много способов, которыми можно сказать, что код не работает. Каким образом ваш код не работает? – mob

+0

'Использование неинициализированного значения при печати в C: \ Users \ Admin \ Desktop \ Scripts \ jsonfile.pl строка 20. 111' Это то, что я получаю ... и он останавливается там. – user2186465

+3

http://search.cpan.org/~mlehmann/JSON-XS-3.01/XS.pm#SPEED –

ответ

3

Ваш код работает нормально. Почти. Я сделал пару попыток.

Вы указали скорость в начале. Неясно, нужен ли вам быстрый ответ или более быстрый способ разбора большого количества информации. Если это первый, читайте дальше. Если это последний, убедитесь, что у вас установлен JSON :: XS.

По стилю я нахожу это болезненным взглядом.

  1. Использование файла do{} для чтения файла заставляет меня хотеть причинить себе боль. Но вы использовали 3-param open. Престижность.
  2. Вы должны почтительное значение массива из хэша
  3. Вы должны обрабатывать пустые значения в данных или вы будете продолжать получать предупреждения

Этот код анализирует вашу JSON и выводит его, substuting пустые Vals с «undefined»:

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"; 
} 
+0

Эй, Дэвид, Спасибо .. Это то, что я хотел. – user2186465

+0

Если мы перейдем к стилям: 'print sprintf' ??? '()' меньше символов, чем 'qw()', то же самое с 'for' v' foreach'. :П – Ashley

Смежные вопросы