2016-03-18 4 views
-2

У меня есть огромный файл json ~ 1000 + lines. Я хотел реализовать две вещи.json parsing using perl

1) В файле JSon, если "Id" : "232799" затем назначить "s" в "1861" Я сделал это с помощью decode_json. Он работает так, как ожидалось.

2) Увеличьте число version на 1 и сохраните файл в определенном каталоге. Я хочу, чтобы это произошло в цикле.

Я считаю, что decode_json следует использовать для анализа json-объекта/json-массива. Однако версия является первой строкой в ​​файле. Я не уверен, что можно использовать декодирование. Все предложения?

{ 
    "version": "16300173", 
    "con": { 
     "s1": { 
      "key": false, 
      "global": { 
       "cu": [ 
        { 
         "Id": "232799", 
         "s": 1861, 
         "Sps": "xx", 
         "cId": "xyzzde", 
         "pat": "-123456789", 
         "Config": true, 
         "auth": [ 
          { 
           "Type": "5", 
           "dir": "in" 
          }, 
          { 
           "Type": "6", 
           "dir": "out" 
          } 
         ], 

сценарий:

#!/usr/bin/perl 

    use strict; 
    use warnings; 
    use JSON; 

    my $json; 
    { 
     open my $fh, "<", "https://stackoverflow.com/a/etc/cm/nw/st/cfg.json" 
      or die("Can't open file \"https://stackoverflow.com/a/etc/cm/nw/st/cfg.json\": $!\n"); 
     local $/; 
     $json = <$fh>; 
    } 

    my $data = decode_json($json); 

    for my $customers (@{ $data->{global}{cu} }) { 
    $customers->{s} = 1861 
     if $customers->{id} ==237299; 

} 

    $json = JSON->new->utf8->pretty->encode($data); 

    { 
     open my $fh, ">" ,"https://stackoverflow.com/a/etc/cm/nw/st/cfg.json" 
      or die("Can't open file \"https://stackoverflow.com/a/etc/cm/nw/st/cfg.json\": $!\n"); 
     local $/; 

     print $fh $json; 


    } 
+1

'$ data-> {global} {cu} 'должно быть' $ data -> {con} {s1} {global} {cu} ', а версия - это просто' $ data -> {versio п} '. – choroba

+0

@choroba Не могли бы вы рассказать мне, как увеличить номер версии? – virat

+0

'$ data -> {version} ++;' должен это делать. – choroba

ответ

0

Как и недостающие {con}{s1} ключи, у вас есть id вместо Id

Этот код появляется на работу

#!/usr/bin/perl 

use strict; 
use warnings; 
use v5.14.1; # for autodie 
use autodie; 

use JSON; 

use constant JSON_FILE => '/a/etc/cm/nw/st/cfg.json'; 

my $data = do { 
    open my $fh, '<', JSON_FILE; 
    local $/; 
    decode_json(<$fh>); 
}; 

my $cu = $data->{con}{s1}{global}{cu}; 

for my $cust (@$cu) { 
    $cust->{s} = 1861 if $cust->{Id} == 232799; 
} 

++$data->{version}; 

{ 
    open my $fh, '>', JSON_FILE; 
    print $fh JSON->new->utf8->pretty->encode($data); 
} 
+0

Если я хочу установить файл в другой каталог после его увеличения, что мне делать? – virat

+0

Объявить вторую константу для выходного файла – Borodin