【问题标题】:Parsing JavaScript object data in Perl在 Perl 中解析 JavaScript 对象数据
【发布时间】:2014-03-24 09:08:15
【问题描述】:

我正在寻找一种从 Perl 中解析真实 JavaScript 对象数据(由于多种原因,不符合 JSON 标准)的方法。

我发现JSON 模块在启用allow_singlequoteallow_barekey 选项的情况下做得很好,但是我在解析包含转义单引号和非转义双引号的单引号值时仍然遇到问题.例如,

{ label : 'can\'t process' }

{ label : '"bad" character' }

投掷

illegal backslash escape sequence in string

invalid character encountered while parsing JSON string

分别,因为该模块只需要对标准字符集进行转义,而不管包含引号。

我以为我找到了可以在 JSON::DWIW 模块中使用的东西,但它自 2010 年以来一直没有更新,我无法安装它。

到目前为止,我唯一的答案是使用 JavaScript 安装一个成熟的 JavaScript 引擎,并将字符串作为 JavaScript 代码运行。这很好用,但远非直截了当,而且对于我想要的东西来说太过分了。

有人对我可以尝试的替代方案有什么建议吗?

【问题讨论】:

    标签: javascript json perl


    【解决方案1】:

    CPAN 上有很多 JSON 模块,其中许多具有容错模式。然而,似乎没有人能够处理这种特殊情况。 (我认为JSONY 可能,但遗憾的是没有。但是,我想如果你报告这个案例,作者可能会热衷于让它发挥作用。)

    我的快速而肮脏的建议是采用现有的纯 Perl JSON 模块,并破解它以使其工作。 JSON::Tiny 是一个不错的候选人。 CPAN 上最新 JSON::Tiny 版本的以下补丁似乎可以解决您提供的两个简短示例:

    --- Tiny.orig   2014-02-22 22:17:50.923272286 +0000
    +++ Tiny.pm 2014-02-22 22:18:23.847435546 +0000
    @@ -160,11 +160,13 @@
       until (m/\G$WHITESPACE_RE\}/gc) {
    
         # Quote
    -    m/\G$WHITESPACE_RE"/gc
    +    m/\G$WHITESPACE_RE(["']|[^\W0-9]\w+)/gc
           or _exception('Expected string while parsing object');
    
         # Key
    -    my $key = _decode_string();
    +    my $key = ($1 =~ /['"]/)
    +      ? _decode_string()
    +      : $1;
    
         # Colon
         m/\G$WHITESPACE_RE:/gc
    @@ -187,13 +189,14 @@
     }
    
     sub _decode_string {
    +  my $quote = shift;
       my $pos = pos;
       # Extract string with escaped characters
    -  m!\G((?:(?:[^\x00-\x1f\\"]|\\(?:["\\/bfnrt]|u[0-9a-fA-F]{4})){0,32766})*)!gc; # segfault on 5.8.x in t/20-mojo-json.t #83
    +  m!\G((?:(?:[^\x00-\x1f\\$quote]|\\(?:[$quote\\/bfnrt]|u[0-9a-fA-F]{4})){0,32766})*)!gc; # segfault on 5.8.x in t/20-mojo-json.t #83
       my $str = $1;
    
       # Invalid character
    -  unless (m/\G"/gc) {
    +  unless (m/\G$quote/gc) {
         _exception('Unexpected character or invalid escape while parsing string')
           if m/\G[\x00-\x1f\\]/;
         _exception('Unterminated string');
    @@ -247,7 +250,8 @@
       m/\G$WHITESPACE_RE/gc;
    
       # String
    -  return _decode_string() if m/\G"/gc;
    +  return _decode_string(q["]) if m/\G"/gc;
    +  return _decode_string(q[']) if m/\G'/gc;
    
       # Array
       return _decode_array() if m/\G\[/gc;
    @@ -268,6 +272,9 @@
       # Null
       return undef if m/\Gnull/gc;  ## no critic (return)
    
    +  # Bareword string
    +  return $1 if m/\G([^\W0-9]\w+)/gc;
    +
       # Invalid character
       _exception('Expected string, array, object, number, boolean or null');
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-02
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      相关资源
      最近更新 更多