-2

I have a huge json file ~1000+ lines. I wanted to implement two things.

1) In the json file,if "Id" : "232799" then assign "s" as "1861" I did this using decode_json. It works as expected.

2)Increment the version number by 1 and save the file in a particular directory. I want this to happen in a loop .

I believe decode_json should be used to parse json object/json array. However, version is the first line in the file.I'm not really sure if decode could be used.Any suggestions?

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

script :

  #!/usr/bin/perl

    use strict;
    use warnings;
    use JSON;

    my $json;
    {
       open my $fh, "<", "/a/etc/cm/nw/st/cfg.json"
          or die("Can't open file \"/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, ">" ,"/a/etc/cm/nw/st/cfg.json"
          or die("Can't open file \"/a/etc/cm/nw/st/cfg.json\": $!\n");
       local $/;

       print $fh $json;


    }
virat
  • 3
  • 1
  • 2

1 Answers1

2

As well as the missing {con}{s1} keys, you have id instead of Id

This code appears to work

#!/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);
}
Borodin
  • 126,100
  • 9
  • 70
  • 144