Wednesday, 20 July 2016

PERL MERGE JSON

Merging multiple JSON files into one using JSON::XS IN PERL


$json1 =

[
   {
      "name" : "bob",
      "title" : "janitor",
      "email" : "",
      "iq" : "180",
      "favorite_food" : "wagyu steak"
   },
   {
      "name" : "joe",
      "title" : "software engineer",
      "email" : "",
      "iq" : "80",
      "favorite_food" : "raw hamburger"
   }
]
 
$json2 =  
{
   "People" : [
      {
         "name" : "bob",
         "title" : "janitor",
         "email" : "",
         "iq" : "180",
         "favorite_food" : "wagyu steak"
      },
      {
         "name" : "joe",
         "title" : "software engineer",
         "email" : "",
         "iq" : "80",
         "favorite_food" : "raw hamburger"
      },
      {
         "name" : "sandy",
         "title" : "dishwasher",
         "email" : "",
         "iq" : "240",
         "favorite_food" : "filet mignon"
      },
      {
         "name" : "george",
         "title" : "software engineer",
         "email" : "",
         "iq" : "14",
         "favorite_food" : "tacos"
      }
   ]   
}

CODE IS,
 
my @fields;
my $uuts = {};
while(<$fh>) {
    chomp;
    next if !-e "/tmp/files/$_.json";
    my $decoded = decode_json( read_file("/tmp/files/$_.json") );
    push @fields, $decoded;
}
$uuts->{People} = [ @fields ];
[download]

to just this:

my $uuts;
while (<$fh>) {
    chomp;
    next if ! -e "/tmp/files/$_.json";
    push @{$uuts->{People}}, @{decode_json(read_file("/tmp/files/$_.js
+on"))};
}  
 
I'm not really in a position to test that; however, here's a small test that shows the technique involved:

$ perl -Mstrict -Mwarnings -le '
    use Data::Dumper;
    my @jsons = ([{a=>1}, {b=>2}], [{c=>3}, {d=>4}]);
    my $combo;
    for (@jsons) {
        print Dumper $_;
        push @{$combo->{People}} => @$_;
    }
    print Dumper $combo;
'
$VAR1 = [
          {
            'a' => 1
          },
          {
            'b' => 2
          }
        ];

$VAR1 = [
          {
            'c' => 3
          },
          {
            'd' => 4
          }
        ];

$VAR1 = {
          'People' => [
                        {
                          'a' => 1
                        },
                        {
                          'b' => 2
                        },
                        {
                          'c' => 3
                        },
                        {
                          'd' => 4
                        }
                      ]
        };