javascript - 在 Perl 中解析 JavaScript 对象数据

标签 javascript json perl

我正在寻找一种从 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 代码运行。这工作正常,但远非直截了当,而且对于我想要的东西来说太过分了。

有没有人对我可以尝试的替代方案有任何建议?

最佳答案

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');
 }

关于javascript - 在 Perl 中解析 JavaScript 对象数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21958370/

相关文章:

mysql - 找不到 DBI.pm,即使它在路径中

javascript - 无法从下拉列表中选择值

javascript - 为两个提交按钮指定 require-attribute

javascript - Array.find(value) 返回值 'is not a function'

javascript - d3 js 分层边缘捆绑数据格式

java - Android JSON 名称顺序

perl - 如何将多个参数传递给 Perl Moo 中的 setter/writer

javascript - 在页面上我声明了一个 js 变量,包含 js 文件似乎无法访问它?

javascript - 使用json数据在chart.js中绘制折线图

mysql - 安全的加密数据库设计