Krusty
Krusty

Reputation: 3

Corrupted JSON encoding in Perl (missign comma)

My custom code (on Perl) give next wrong JSON, missing comma between blocks:

{
    "data": [{
        "{#LOGFILEPATH}": "/tmp/QRZ2007.tcserverlogs",
        "{#LOGFILE}": "QRZ2007"
    } **missing comma** {
        "{#LOGFILE}": "ARZ2007",
        "{#LOGFILEPATH}": "/tmp/ARZ2007.tcserverlogs"
    }]
}

My terrible code:

#!/usr/bin/perl

    use strict;
    use warnings;
    use File::Basename;
    use utf8;
    use JSON;
    binmode STDOUT, ":utf8";


    my $dir = $ARGV[0];    
    my $json = JSON->new->utf8->space_after;
    opendir(DIR, $dir) or die $!;
    print '{"data": [';
    while (my $file = readdir(DIR)) {

        next unless (-f "$dir/$file");

        next unless ($file =~ m/\.tcserverlogs$/);
        my $fullPath = "$dir/$file";
        my $filenameshort = basename($file,  ".tcserverlogs");

        my $data_to_json = {"{#LOGFILEPATH}"=>$fullPath,"{#LOGFILE}"=>$filenameshort};
        my $data_to_json = {"{#LOGFILEPATH}"=>$fullPath,"{#LOGFILE}"=>$filenameshort};
        print $json->encode($data_to_json);

    }

    print ']}'."\n";
    closedir(DIR);
    exit 0;

Dear Team i am not a programmer, please any idea how fix it, thank you!

Upvotes: 0

Views: 181

Answers (1)

simbabque
simbabque

Reputation: 54333

If you do not print a comma, you will not get a comma.

You are trying to build your own JSON string from pre-encoded pieces of smaller data structures. That will not work unless you tell Perl when to put commas. You could do that, but it's easier to just collect all the data into a Perl data structure that is equivalent to the JSON string you want to produce, and encode the whole thing in one go when you're done.

my $dir  = $ARGV[0];
my $json = JSON->new->utf8->space_after;
my @data;

opendir( DIR, $dir ) or die $!;
while ( my $file = readdir(DIR) ) {

    next unless ( -f "$dir/$file" );
    next unless ( $file =~ m/\.tcserverlogs$/ );
    my $fullPath = "$dir/$file";
    my $filenameshort = basename( $file, ".tcserverlogs" );

    my $data_to_json = { "{#LOGFILEPATH}" => $fullPath, "{#LOGFILE}" => $filenameshort };
    push @data, $data_to_json;
}
closedir(DIR);

print $json->encode( { data => \@data } );

Upvotes: 4

Related Questions