2017-08-14 41 views
0

使看起來像散列數組的字符串變成真實數組的最佳方式是什麼?Ruby使這個字符串成爲數組的最佳方式?

該字符串看起來像這樣:[{name:"lol", age:12},{name:"lmao", age:66},{name: "roflcopter", age:99}] 和我需要得到完全相同,但作爲一個數組。

輸入:(字符串)

'[{name:"lol", age:12},{name:"lmao", age:66},{name: "roflcopter", age:99}]' 

預期輸出:(散列數組)

[{name:"lol", age:12},{name:"lmao", age:66},{name: "roflcopter", age:99}] 
+1

輸入是什麼?你試過什麼了? https://stackoverflow.com/help/how-to-ask – whodini9

+1

數組是什麼?名字呢?年齡?都?請給我們一個更詳細的例子 –

+0

@ whodini9更新了問題 –

回答

4

您的字符串非常相似,但不是相當於與JSON相同。這意味着你有三個選擇。


1)將其轉換爲JSON(上游)

你的字符串和正確的JSON字符串之間的唯一區別是,在JSON,所有的鍵必須用引號引用。如果你在你的字符串格式控制,我建議你改變它是JSON格式:使用JSON.parse

'[{"name":"lol", "age":12},{"name":"lmao", "age":66},{"name": "roflcopter", "age":99}]' 

一旦字符串在此格式下,你可以把它變成散列的數組:

require "json" 
source_string = '[{"name":"lol", "age":12},{"name":"lmao", "age":66},{"name": "roflcopter", "age":99}]' 
data = JSON.parse source_string 
puts data[0] #=> {"name"=>"lol", "age"=>12} 

高度推薦這個過程。包含的JSON解析器以安全的方式處理所有字符串驗證。而且,JSON基本上是爲了以字符串形式提供數組和散列而設計的。人們會理解這是一個公認的標準。


2)將其轉換爲JSON(下游)

如果由於某種原因,你不能更新你的源字符串是JSON在默認情況下(也許你與第三方誰拒絕採取工作更好的標準),你可以通過編程的方式修改字符串爲正確的JSON格式。其實我去前進,寫了一個正則表達式這將對串繞適當的引號:

source_string = '[{name:"lol", age:12},{name:"lmao", age:66},{name: "roflcopter", age:99}]' 
json_string = source_string.gsub /(?<=[{,])\s*(\w+)(?=:)/, '"\1"' 
data = JSON.parse json_string 
puts data[0] #=> {"name"=>"lol", "age"=>12} 

3)使用eval

你的字符串,以目前的格式,是有效的Ruby代碼。這意味着你可以使用eval來執行它作爲Ruby代碼:

data = eval('[{name:"lol", age:12},{name:"lmao", age:66},{name: "roflcopter", age:99}]') 
puts data[0] #=>{name: "lol", age: 12} 

eval的問題,我和其他許多人會強烈反對它的理由是,這是令人難以置信不安全。你說的數據是從POST請求 - 未來如果用戶恰好修改發送字符串「系統(‘RM *’)」的要求,你的代碼將執行:

eval("system('rm *')") 

哪,你可能猜到了,會擦拭你的硬盤。您可以嘗試編寫字符串驗證以確保字符串在運行之前是安全的,但從安全的角度來看,這種驗證不是一件容易的事情,並且eval可能永遠是代碼中最薄弱的一點。

老實說,你沒有理由這樣做,特別是因爲選項#2是非常直接的。我只提到它,所以你知道要避免它。

+0

太棒了!謝謝百萬 –

+0

2)將失敗,如果一個字符串包含匹配的正則表達式。 –

+0

@CameronMartin你的意思是有#2的情況下,有效的字符串將不適當'gsub'-ed並會拋出一個錯誤? – eiko

0

顯然第一選擇是不發送數據作爲紅寶石源代碼。但是,如果您確實需要這樣做:

如果輸入來自信任來源,則可以使用eval

否則,您可以使用ruby parser解析字符串,然後從AST生成陣列和散列。

+1

不幸的是,它不是JSON。鑰匙需要用引號包圍。這是一個小小的差異,但足以打破解析器。 – eiko

+1

啊,是的,沒有看到。 –

+0

是的,也是來源不安全,請刪除這個答案。 –

相關問題