2016-03-18 17 views
-2

Ich habe eine riesige JSON-Datei ~ 1000 + Zeilen. Ich wollte zwei Dinge umsetzen.JSON Parsing mit Perl

1) In der JSON-Datei, wenn "Id" : "232799" dann zuweisen "s" als "1861" ich dies mit decode_json tat. Es funktioniert wie erwartet.

2) Erhöhen Sie die Nummer version um 1 und speichern Sie die Datei in einem bestimmten Verzeichnis. Ich möchte, dass dies in einer Schleife geschieht.

Ich glaube, decode_json sollte verwendet werden, um JSON-Objekt/JSON-Array zu analysieren. Allerdings ist Version die erste Zeile in der Datei.Ich bin nicht wirklich sicher, ob decode verwendet werden könnte.Any Vorschläge?

{ 
    "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" 
          } 
         ], 

Skript:

#!/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

'$ Daten- scheint zu funktionieren> {global} {cu} 'sollte' $ data -> {con} {s1} {global} {cu} 'sein, und Version ist nur' $ data -> {versio n} '. – choroba

+0

@choroba können Sie mir bitte sagen, wie Sie die Versionsnummer erhöhen? – virat

+0

'$ data -> {version} ++;' sollte es tun. – choroba

Antwort

0

Neben den fehlenden {con}{s1} Schlüssel, haben Sie id statt Id

Dieser Code

#!/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

Wenn ich die Datei nach dem Inkrementieren in einem anderen Verzeichnis installieren möchte, was soll ich tun? – virat

+0

Deklarieren Sie eine zweite Konstante für die Ausgabedatei – Borodin