Для проектов Rails я обнаружил, что встроенный JS-декодер ActiveSupport является хорошим решением. Просто оберните строку в JSON, расшифруйте ее и верните новый массив:
def to_a(str)
wrapped_str = "{ \"wrapper\": #{str} }"
ActiveSupport::JSON.decode(wrapped_str)['wrapper'] rescue str
end
str = '[1, 2, [3, [4, 5, true, "a", {"test": "whee"}]]]'
str_to_a = to_a(str)
Это вернет массив, если строка является допустимым JSON. Если декодирование завершится неудачно, будет возвращена исходная строка. Обратите внимание, что действительный JSON в этом случае относится только к содержимому массива - если массив строк содержит какие-либо хэши (здесь следует предостережение), все хеш-ключи должны быть заключены в double цитаты. Также обратите внимание, что логические значения будут преобразованы в логические значения только в том случае, если они не заключены в кавычки.
Возвращение исходной строки при неудачном декодировании позволяет преобразовывать строки только там, где это успешно (другие строки остаются без изменений). В качестве альтернативы, вы можете принудительно преобразовать все в массив (или пустой массив), используя rescue []
.