您的字符串非常相似,但不是相當於與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是非常直接的。我只提到它,所以你知道要避免它。
輸入是什麼?你試過什麼了? https://stackoverflow.com/help/how-to-ask – whodini9
數組是什麼?名字呢?年齡?都?請給我們一個更詳細的例子 –
@ whodini9更新了問題 –