【问题标题】:How can I suppress \\ in my output from Perl's JSON module?如何在 Perl 的 JSON 模块的输出中抑制 \\?
【发布时间】:2009-10-14 19:16:46
【问题描述】:

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

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

有什么解决方案可以删除那些双 \\ 斜杠吗?

【问题讨论】:

  • 如果你删除它们,它就不再是正确的 JSON
  • 使用 Javascript 解析此输出时是否出错?
  • 'JavaScript' ne 'Java'
  • 它应该显示一个斜杠。但请注意,这与 Java 无关。它是 JavaScript 对象表示法。
  • 脚本的“输出”就是我喜欢称之为“正确”的东西。如果要输出不正确的数据,我推荐perl -e 'print chr rand 255 for 1..100'。短得多。

标签: perl json escaping


【解决方案1】:

正如Greg 所述,“\”字符在 JSON 中表示为“\\”。

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

【讨论】:

    【解决方案2】:

    如果您打算在某个地方使用“解冻”JSON,例如在另一个 Perl 程序或 JavaScript 中,您仍然会得到您输入的内容。

    你想用你的 JSON 做其他事情吗?

    【讨论】:

      【解决方案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 文件 (x86)\bin\sample

      【讨论】:

      • 阿门。我希望更多的人知道这个技巧。我已经看到很多“便携式”代码跳过了试图处理 Windows 路径的不必要的麻烦。
      • 仍然需要箍。毕竟/C:/Program Files/bin/sample 无效。
      • 不确定我是否关注。这是一个完全有效的 Windows 路径 AFAICT。它位于当前驱动器上名为“C:”的目录下。显然文件系统布局不同,但是在 cwd 下具有给定文件结构的应用程序始终可以在系统之间使用相同的路径。
      猜你喜欢
      • 2012-05-09
      • 2017-08-17
      • 1970-01-01
      • 2018-08-23
      • 1970-01-01
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多