如何在Perl的JSON模块的输出中抑制\\?

时间:2009-10-14 19:16:47

标签: perl json escaping

以下代码始终使用双斜杠打印路径:

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";

此脚本的输出是

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

删除那些双\\斜杠的任何解决方案?

3 个答案:

答案 0 :(得分:7)

提到Greg时,“\”字符在JSON中表示为“\\”。

http://www.ietf.org/rfc/rfc4627.txt?number=4627

答案 1 :(得分:4)

如果您打算在某个地方使用“解冻”JSON,就像在另一个Perl程序或JavaScript中一样,您仍然可以准确地获取您放入的内容。

您是否尝试使用JSON执行其他操作?

答案 2 :(得分: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