這是我的字符串如何將字符串轉換爲哈希
"{web:{url:http://www.example.com,toke:somevalue},username:person}"
我想將它轉換成一個哈希值,像這樣:
```
{
'web' => {
'url' => "http://www.example.com",
'token' => 'somevalue'
},
'username' => "person"
}
` `
這是我的字符串如何將字符串轉換爲哈希
"{web:{url:http://www.example.com,toke:somevalue},username:person}"
我想將它轉換成一個哈希值,像這樣:
```
{
'web' => {
'url' => "http://www.example.com",
'token' => 'somevalue'
},
'username' => "person"
}
` `
你必須編寫一個自定義分析器。它幾乎是json,但由於這些值未被引用,因此不會使用JSON解析器進行解析,因此除非您可以獲取引用的值,否則必須手動解析它。
在值中處理冒號,逗號和大括號將是一個挑戰。
謝謝,你能幫忙嗎? – chucai
當然,使用JSON。 –
簡單的解析器,僅在幾個示例上進行了測試。
用法:
parse_string("{web:{url:http://www.example.com,toke:somevalue},username:person}")
=> {"web"=>{"url"=>"http://www.example.com", "toke"=>"somevalue"}, "username"=>"person"}
解析器代碼:
class ParserIterator
attr_accessor :i, :string
def initialize string,i=0
@i=i
@string=string
end
def read_until(*sym)
res=''
until sym.include?(s=self.curr)
throw 'syntax error' if s.nil?
res+=self.next
end
res
end
def next
self.i+=1
self.string[self.i-1]
end
def get_next
self.string[self.i+1]
end
def curr
self.string[self.i]
end
def check(*sym)
throw 'syntax error' until sym.include?(self.next)
end
def check_curr(*sym)
throw 'syntax error' until sym.include?(self.curr)
end
end
def parse_string(str)
parse_hash(ParserIterator.new(str))
end
def parse_hash(it)
it.check('{')
res={}
until it.curr=='}'
it.next if it.curr==','
k,v=parse_pair(it)
res[k]=v
end
it.check('}')
res
end
def parse_pair(it)
key=it.read_until(':')
it.check(':')
value=(it.curr=='{' ? parse_hash(it) : it.read_until(',','}'))
return key,value
end
非常感謝! – chucai
我會建議使用的ActiveSupport :: JSON.decode假設你有寶石可用還是願意把它列入你的寶石列表。
一個問題是要有JSON字符串。所以如果你有散列,你可以調用#to_json來獲得json字符串。例如這個作品:
str = '{"web":{"url":"http://www.example.com","toke":"somevalue"},"username":"person"}'
ActiveSupport::JSON.decode(str)
你可以告訴我們有關哈希的字符串表示形式的細節,因爲它既不是散列字符串表示的Ruby或JSON味道? – waldrumpus
如何判斷'url'是一個鍵還是'url:http'是一個鍵?而且,將'toke'轉換爲'token'的規則是什麼? – sawa
如何使用您的格式設置空值? – rogal111