конвертировать Javascript Object в Ruby Hash - PullRequest
4 голосов
/ 06 марта 2012

У меня есть объект 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?

Ответы [ 2 ]

3 голосов
/ 06 марта 2012

ruby ​​1.9 поддерживает хэш такого типа, который напоминает объект javascript

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

чтобы преобразовать это в хэш рубина

 eval(obj)
2 голосов
/ 06 марта 2012

Это не 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...