2009-10-14 44 views
0

下面的代碼總是打印路徑用雙斜線:這個腳本的如何在Perl的JSON模塊的輸出中抑制\?

use JSON; 
use File::Spec; 

my $installdir = $ENV{"ProgramFiles"}; 
my $xptrlc = File::Spec->catfile($installdir,"bin","sample"); 

my $jobhash; 
my $return_packet; 
$jobhash->{'PATH'} = $xptrlc; 
$return_packet->{'JOB'} = $jobhash; 

my $js = new JSON; 
my $str = $js->objToJson($return_packet); 

print STDERR "===> $str \n"; 

輸出是

任何解決方案,以消除那些雙斜線\\

+12

如果你刪除它們,它將不會是正確的JSON更多 – Greg

+1

當tring使用Javascript解析這個輸出時你有錯誤嗎? –

+0

我不是java專家,但是當我在GUI端解析這個JSON並顯示它時應該發生什麼,它應該顯示\\還是單斜槓\\ – Avinash

回答

3

的Windows是在路徑中使用'/'如果你煩惱那麼多完美的罰款:

use strict; use warnings; 

use JSON; 
use File::Spec::Functions qw(catfile); 

my $installdir = $ENV{ProgramFiles}; 
my $xptrlc = catfile $installdir,qw(bin sample); 
$xptrlc =~ s'\\'/'g; 

my $packet = { JOB => { PATH => $xptrlc } }; 

my $js = JSON->new; 
my $str = $js->encode($packet); 

warn "===> $str \n"; 

輸出:

 
===> {"JOB":{"PATH":"C:/Program Files/bin/sample"}} 

在另一方面,編碼值將被正確解碼:

use JSON; 
warn JSON->new->decode(scalar <DATA>)->{JOB}->{PATH}, "\n"; 

__DATA__ 
{"JOB":{"PATH":"C:\\Program Files (x86)\\bin\\sample"}} 

輸出:

 
C:\Temp> ht 
C:\Program Files (x86)\bin\sample 
+3

阿門。我希望更多的人知道這個訣竅。我已經看到很多「便攜」代碼通過嘗試處理Windows路徑的不必要的代碼跳過。 –

+0

箍仍然是必需的。畢竟,'/ C:/ Program Files/bin/sample'是無效的。 – jrockway

+0

不知道我關注。這是一個非常有效的Windows路徑AFAICT。它位於當前驅動器上名爲「C:」的目錄下。很明顯,文件系統佈局是不同的,但是在cwd下具有給定文件結構的應用程序總是可以在系統之間使用相同的路徑。 –

4

如果您打算在另一個Perl程序或在JavaScript中使用「解凍」的JSON地方,例如,你仍然會回到你把正是在

你。試圖用你的JSON做別的事情?