将Javascript对象转换为Ruby哈希表。

5

我有一个这样的Javascript对象:

 obj = "[
   {
     title: "Sean Kingston1",
     duration: parseInt("71", 10),
   },
   {
     title: "Sean Kingston2",
     duration: parseInt("71", 10),
   },
 ]"

有没有一种方法将它转换为Ruby哈希表?
我尝试使用JSON.parse和JSON.load。 但两者都会抛出异常。
 JSON::ParserError: lexical error: invalid string in json text.
                               {   title: "Sean Kingston1
                 (right here) ------^

是否有通用解决方案,还是我应该使用正则表达式,然后在Ruby中构建哈希表?


1
删除你的旧问题,并创建一个新问题并不会改变你所拥有的内容不是有效的JSON。 - Andrew Marshall
2
@andrew 我已经修改了问题,它是一个 JavaScript 对象,这是我从服务器获取的... 你知道这个问题的答案吗? - vireshas
@andrew 我从未使用过JSON这个词! - vireshas
1
你在将它标记为JSON时完成了。 - Andrew Marshall
我认为这是一个非常好的问题,表述得很正确。它是一个Javascript对象,而不是JSON。 - gerard
显示剩余2条评论
2个回答

4

Ruby 1.9支持这种类似于JavaScript对象的哈希表

 obj = "[
  {
   title: "Sean Kingston1",
   duration: "71",
  },
  {
   title: "Sean Kingston2",
   duration: "71",
  },
 ]"

将此转换为Ruby哈希表。
 eval(obj)

实际上,您可能需要使用未引用的数字。至少在 JSON 中允许这样做(JSON 语法更加严格)。 - kirilloid
@kirilloid 好的,我马上处理,谢谢 :) 实际上,我是通过爬取一个网站来获取这个JS对象的,我的爬虫是用Ruby编写的! - vireshas
6
从随机网站eval代码时要小心! - Benjamin Manns
当我试图从这个数据 http://a0.awsstatic.com/pricing/1/ec2/linux-od.min.js 构建一个 Ruby Map 时,我找到了自己的答案 :-) - vireshas

2

这不是一个JSON。实际上,JSON不同于代码,可以由JavaScript解释并转换为对象。

JSON本身只允许静态值(不包括parseInt),任何键都应该用引号括起来。

[{
    "title": "Sean Kingston1",
    "duration": 71
 },
 {
    "title": "Sean Kingston2",
    "duration": 71
 }]

使用正则表达式等技术并不好。最好正确地格式化JSON。

如果您无法修改该输入,则可以使用以下正则表达式解决特定输入的问题:

/^\s*(\w+)\s*:/, '"\1":';
/:\s*parseInt\("(\d+)"\,\s*10)/, ': \1';

如果要处理不同的输入变化,你需要添加越来越多的正则表达式。

通常,为了解释 JavaScript 代码,你需要...解释 JavaScript 代码。

这可以通过安装一些 JS 引擎(例如 Rhino 或 V8)并将其绑定到 Ruby 来实现。


我所拥有的 JavaScript 代码不在我的控制之下 :( 我正在爬取一个网站.. - vireshas
我非常小心,不使用JSON这个词,我有一个类似的JavaScript对象.. 现在我该如何将它转换为哈希?是否有解决方案或者我应该使用正则表达式? - vireshas
理想情况下,为了解析这样的代码,您需要拥有完整的JavaScript解释器,以便将任何输入评估为对象、哈希或其他内容(我不熟悉Ruby)。 - kirilloid
我做了类似的事情,用数字替换了parseInt("",""),然后调用eval(obj),它起作用了 :) - vireshas
嗯。你可以调用JS代码的eval函数吗?Eval并不是好东西,但在这里会起作用。 - kirilloid
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接