2012-04-03 28 views

Trả lời

22

Nếu bạn biết rằng chuỗi chứa một mảng, bạn chỉ có thể sử dụng đơn giản eval;

arr = eval(str) 

Nếu bạn không chắc chắn, bạn có thể đi cho niềng răng tham gia nhiều hơn một chút tháo, tách trên , và thu thập các con số để một mảng;

arr = str[1..-2].split(',').collect! {|n| n.to_i} 

Bản trình diễn của cả hai here.

+6

Whoa there, cowboy! Không quá nhanh. Đánh giá là * rất * nguy hiểm. Nếu str đến từ mạng nội bộ tà ác, chẳng hạn như thông số, ứng dụng của bạn có thể đang chạy BẤT CỨ. Hãy tưởng tượng một hacker thay đổi thông số str đó từ "[123,456,789]" thành "User.destroy_all". Bạn sẽ an toàn hơn với tùy chọn thứ hai và phân tích cú pháp các id. – IAmNaN

2

Điều đơn giản nhất là arr = eval(str) nhưng điều đó không an toàn lắm. Một tùy chọn khác là làm một cái gì đó như arr = str.gsub(/\[|\]/,'').split(/,/).map(&:to_i) - loại bỏ các dấu ngoặc đơn từ chuỗi gốc, tách trên dấu phẩy và sau đó chuyển đổi các đoạn chuỗi kết quả thành số nguyên.

4
str = "[123, 345, 567]" 

1) eval(str) 

2) str = "[123, 345, 567]".scan(/\d+/) # Make the array 
str.map!{ |s| s.to_i } # convert into integer 
1

Đối với các dự án Rails, tôi đã nhận thấy bộ giải mã ActiveSupport JSON tích hợp là một giải pháp tốt. Chỉ cần quấn chuỗi trong JSON, giải mã nó, sau đó trả về mảng mới:

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) 

Điều này sẽ trả lại một mảng miễn là chuỗi là JSON hợp lệ. Nếu giải mã không thành công, chuỗi gốc sẽ được trả lại. Lưu ý rằng JSON hợp lệ trong trường hợp này chỉ liên quan đến nội dung của mảng - nếu mảng chuỗi chứa bất kỳ băm nào (ở đây có báo trước), tất cả các khóa băm phải được đính kèm trong double trích dẫn. Cũng lưu ý rằng các giá trị boolean sẽ chỉ được chuyển thành các toán tử nếu chúng không phải là kèm theo trong dấu ngoặc kép.

Trả về chuỗi ban đầu về lỗi giải mã cho phép chuyển đổi chuỗi chỉ khi nó thành công (để lại các chuỗi khác không đổi). Ngoài ra, bạn có thể buộc tất cả mọi thứ vào một mảng (hoặc mảng trống) bằng cách sử dụng rescue [] để thay thế.

Các vấn đề liên quan