2017-01-30 10 views
0

(Perlの上の)私のカスタムコードは、ブロック間のカンマが欠落し、次の間違ったJSONを与える:破損JSONエンコーディング(missignカンマ)

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

私のひどいコード:

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

親愛なるチームIプログラマではありません、どのようにそれを修正することをお考えください、ありがとう!

+1

コードは問題ありません。コンマは印刷されていないので、コンマはありません。 JSONモジュールを使用する予定はありません。 1つのデータ構造を作成し、一度にエンコードする必要があります。 JSONモジュールはステップバイステップ変換をサポートしていません。また、 '$ data_to_json'を2回宣言します。あなたのプログラムはコンパイルされません。 – simbabque

答えて

4

カンマを印刷しないと、コンマが表示されません。

事前にエンコードされた小さなデータ構造から独自のJSON文字列を作成しようとしています。あなたがPerlにコンマを入力するよう指示しない限り、それは動作しません。そうすることはできますが、作成したいJSON文字列に相当するPerlデータ構造にすべてのデータを集めるだけで、作業が完了したらすべてを一度にエンコードする方が簡単です。

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 }); 
+0

親愛なる@simbabque非常にマッハーありがとう! – Krusty